匹配中文字符的正则表达式: [u4e00-u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字
匹配身份证:d{15}|d{18}
评注:中国的身份证为15位或18位
匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]d*$ //匹配正整数
^-[1-9]d*$ //匹配负整数
^-?[1-9]d*$ //匹配整数
^[1-9]d*|0$ //匹配非负整数(正整数 + 0)
^-[1-9]d*|0$ //匹配非正整数(负整数 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$ //匹配正浮点数
^-([1-9]d*.d*|0.d*[1-9]d*)$ //匹配负浮点数
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //匹配浮点数
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下:
只能输入数字:“^[0-9]*$”
只能输入n位的数字:“^d{n}$”
只能输入至少n位数字:“^d{n,}$”
只能输入m-n位的数字:“^d{m,n}$”
只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$”
只能输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$”
只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9]{1,3})?$”
只能输入非零的正整数:“^+?[1-9][0-9]*$”
只能输入非零的负整数:“^-[1-9][0-9]*$”
只能输入长度为3的字符:“^.{3}$”
只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$”
只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$”
只能输入由26个小写英文字母组成的字符串:“^[a-z]+$”
只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$”
只能输入由数字、26个英文字母或者下划线组成的字符串:“^w+$”
验证用户密码:“^[a-zA-Z]w{5,17}$”正确格式为:以字母开头,长度在6-18之间,
只能包含字符、数字和下划线。
验证是否含有^%&',;=?$"等字符:“[^%&',;=?$x22]+”
只能输入汉字:“^[u4e00-u9fa5],{0,}$”
验证Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”
验证InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$”
验证电话号码:“^((d{3,4})|d{3,4}-)?d{7,8}$”
正确格式为:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”,
“XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。
验证身份证号(15位或18位数字):“^d{15}|d{}18$”
验证一年的12个月:“^(0?[1-9]|1[0-2])$”正确格式为:“01”-“09”和“1”“12”
验证一个月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$”
正确格式为:“01”“09”和“1”“31”。
匹配中文字符的正则表达式: [u4e00-u9fa5]
匹配双字节字符(包括汉字在内):[^x00-xff]
匹配空行的正则表达式:n[s| ]*r
匹配HTML标记的正则表达式:/<(.*)>.*</1>|<(.*) />/
匹配首尾空格的正则表达式:(^s*)|(s*$)
匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?
(1)应用:计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;}
(2)应用:javascript中没有像vbscript那样的trim函数,我们就可以利用这个表达式来实现
String.prototype.trim = function()
{
return this.replace(/(^s*)|(s*$)/g, "");
}
(3)应用:利用正则表达式分解和转换IP地址
function IP2V(ip) //IP地址转换成对应数值
{
re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正则表达式
if(re.test(ip))
{
return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
}
else
{
throw new Error("Not a valid IP address!")
}
}
(4)应用:从URL地址中提取文件名的javascript程序
s="http://www.9499.net/page1.htm";
s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ; //Page1.htm
(5)应用:利用正则表达式限制网页表单里的文本框输入内容
用 正则表达式限制只能输入中文:onkeyup="value=value.replace(/[^u4E00-u9FA5] /g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,''))"
用 正则表达式限制只能输入全角字符: onkeyup="value=value.replace(/[^uFF00-uFFFF] /g,'') " onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,''))"
用 正则表达式限制只能输入数字:onkeyup="value=value.replace(/[^d] /g,'') "onbeforepaste= "clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''))"
用 正则表达式限制只能输入数字和英文:onkeyup="value=value.replace(/[W] /g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,''
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.Data.SqlClient;
using TB06030E.BEM;
using System.Drawing;
using System.Reflection;
using System.Web.SessionState;
public partial class jdwl_SelectAdmin_PrintTables_PrintStuInfo : System.Web.UI.Page
{
BEM_tbOpenClass bem = new BEM_tbOpenClass();
protected void Page_Load(object sender, EventArgs e)
{
GridView1.DataSource = Bind();
GridView1.DataBind();
}
private DataTable Bind()
{
string sql = "";
sql = "Select * from Customers";
string DBConfig_sql = "server=10.0.12.98; database=ndwuli;uid=sa;pwd=sa";
DataSet ds = new DataSet();
SqlConnection sqlCon = new SqlConnection(DBConfig_sql);
SqlCommand sqlCmd = new SqlCommand(sql, sqlCon);
SqlDataAdapter sqlAd = new SqlDataAdapter();
sqlAd.SelectCommand = sqlCmd;
sqlAd.Fill(ds);
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("sno", typeof(string))); //数据库中列次序为准
dt.Columns.Add(new DataColumn("classkind", typeof(string)));
dt.Columns.Add(new DataColumn("11", typeof(int)));
dt.Columns.Add(new DataColumn("12", typeof(int)));
dt.Columns.Add(new DataColumn("13", typeof(int)));
dt.Columns.Add(new DataColumn("14", typeof(int)));
dt.Columns.Add(new DataColumn("15", typeof(int)));
DataRow dr;
int k = 0;
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{
dr = dt.NewRow();
for (int j = 0; j < 7; j++)
dr[j] = ds.Tables[0].Rows[i][j].ToString();
dr[1] = " ";
if (i % 8 == 0)
{
k++;
dr[1] = "物理系" + k + "组"; //数据库中1为准
}
dt.Rows.Add(dr);
}
return dt;
}
public override void VerifyRenderingInServerForm( Control control )
{
}
protected void GridView1_RowDataBound( object sender, GridViewRowEventArgs e )
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.Cells[1].Attributes.Add("style", "vnd.ms-excel.numberformat:@;");
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Clear();
Response.Buffer = true;
Response.Charset = "GB2312";
Response.AppendHeader("Content-Disposition", "attachment;filename=FileName.xls");
// 如果设置为 GetEncoding("GB2312");导出的文件将会出现乱码!!!
Response.ContentEncoding = System.Text.Encoding.UTF7;
Response.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。
System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
this.GridView1.RenderControl(oHtmlTextWriter);
Response.Output.Write(oStringWriter.ToString());
Response.Flush();
Response.End();
}
}
在浏览器中查看页面,会发现所有字段全部显示在页面上,如下图所示:
图中用红色标出的部分是每一更的"HeaderText"属性,默认是采用的该列的字段名称。
二、设置列属性
在基本用法中,是自动将DataTable中所有的字段全部显示出来,但在实际中,往往只需要显示所需要的字段,这就需要设置GridView中列的属性。
GridView是由许多“列”对象组成,可以在GridView对象中看到有一个Columns的属性。可以通过设置列的属性达到我们所需要的显示效果。
如上两图所示,进行编辑列的界面,先选中GridView控件,然后即可以通过aspx页面控件上的右向箭头点击菜单进入,也可通过属性的"Columns"编辑按钮进入。
列编辑界面如下:
上图就是列编辑的对话框,红色框标识出基本的属性界面功能。除了“DataField”和“HeaderText”两个属性外,还有一个定义列宽的属性也经常用,在“样式”分类中的“ItemStyle”属性群里有一个“Width”属性,既可定义固定的宽度(如100px),也可定义为百分比(如:50%)。
在上图所示的对话框中,演示了“BoundField”类型的字段,此类型的字段是将数据表中的字段值以文本的方式进行显示,相对来说功能较为简单。除了图中演示的“BoundField”,还有其它类型的字段,下面就分别介绍其它常规列的使用。
三、常规列属性
1.BoundField
此类型的列是将数据表中的字段内容用文本的方式显示出来。
2.CheckBoxField(不常用)
常用来显示数据库中的布尔类型字段的值
3.HyperLinkField
显示一个链接,此类型字段常用,其主要属性是:
DataNavigateUrlFields、DataNavigateUrlFormatString、DataTextField、DataTextFormatString
如:要在此列中形成一个链接,链接的文字是“公司名称”,链接到查看公司详细信息的页面:ViewCompany.aspx,并且页面后要跟一个参数ID=xxxx。第一条记录ID=ALFKI,CompanyName=Alfreds Futterkiste,其生成的链接应该是ViewCompany.aspx?ID=ALFKI,其链接文本为“Alfreds Futterkiste”,以上四个属性定义的值如下:
DataNavigateUrlFields 的值为 "CustomerID"
DataNavigateUrlFormatString 的值为 "ViewCompany.aspx?id={0}",在生成时,{0}就会用DataNavigateUrlFields属性所定义的字段的值进行替换。
DataTextField的值为"CompanyName"
DataTextFormatString的值为"{0}",也就是只显示其公司的名称,无其它多余文字。显示效果如下图所示:
4.ImageField(不常用)
用于显示存储图片的二进制类型字段的数据,直接将二进制字段存储的图片数据显示为图片,但此字段在VS2005之后去掉了DataField属性,加入了DataImageUrlField字段,其意思是不再支持直接显示二进制内容为图片,而是需要自己再写一个显示页面,在这个页面去读取二进制字段内容,并将其输出为图片内容。此字段不常用。
5.ButtonField
此列显示为“按钮”,注意:按钮并不只是HTML语言中的<input type="button"...>这一种类型,在asp.net中,能够完成将表单(页面)提交(PostBack)到服务器动作的控件都可以称之为“按钮”,因此,此类型的字段有一个属性:ButtonType有三个选项,Link、Image、Button,表示了“按钮”的三种表现形式,分别对应着“工具箱”中的LinkButton、ImageButton、Button三种控件。
当按钮被Click之后,会触发GridView的“RowCommand”事件,按钮被点击后执行什么样的程序,要在RowCommand事件中去写。
有这样一个问题:如果一个GridView中有多个Button列,但只有一个RowCommand事件,那么如何知道当前是哪一列的Button被Click了呢?这就需要通过ButtonField列的CommandName属性来指定。
如:有两个ButtonField列,将第一列的CommandName属性设置为“这是第一列”,将第二列的CommandName属性设置为“这是第二列”。
选中GridView控件,在“属性面板”的“事件”页中双击RowCommand事件后的空格。
再在aspx.cs文件中的GridView的RowCommand事件中程序如下书写:
protected void GridView1_RowCommand(object sender, GridViewCommandEventArgs e)
{
switch (e.CommandName)
{
case "这是第一列":
//此处请写被点击后需要处理的事务
Response.Write("第一列被点击");
break;
case "这是第二列":
//此处请写被点击后需要处理的事务
Response.Write("第二列被点击");
break;
}
}
6.CommandField
此列的实质与ButtonField列没有任何区别,唯有的区别就是不需要再设置CommandName属性,而是每一种按钮对应了GridView的一种事件,而不是RowCommand事件,如:编辑按钮对应着RowEditing事件,删除按钮对应着RowDeleting(删除之时)和RowDeleted(删除之后)两个事件,以此类推,这里就不一一列举。也不再举例。
四、模板列
前面几个类型的列,把它们统称为“常规列”,模板列(Template)与之前的几个列的区别在于:之前的列都相当于一个单个的控件,而此列相当于一个容器,在容器中又可以拖入多个控件,构成更复杂的单元格内容。GridView之所以灵活就灵活在这个模板列。在列定义的对话框中加入一个模板列,只设置HeadText和ItemStyle.Width等属性,再点击确定关闭对话框。在aspx页面中选中GridView控件并点击右向箭头,如下图所示:
点击“编辑模板”进入下面界面:
可以看到,右方的下拉列表中列出了模板列的名称,如果有多个模板列,则会列出多个模板列的名称,每个模板下有多个Template,我们一般只需要编辑ItemTemplate,其它的Template大家可以根据其名称推测其作用。
ItemTemplate就是“容器”,可以将“工具箱”中的控件拖入其中。上图中就拖入一个Image控件,一个Button控件和一个CheckBox控件。
选中这些控件,并在属性面板中将其ID改为有意义的名称。其具体的用法在后面再讲。
模板列编辑结束后,点击右向箭头选择“结束模板编辑”。
五、RowDataBound事件
上面只是定义了模板列,如果要其显示出每条记录的相应信息,还需要将模板列中的控件属性赋值,这个动作一般放在GridView的RowDataBound事件中去完成。双击属性面板的动作页,定义一个RowDataBound事件。假定刚才定义的三个控件其ID分别为:imgTemp,btnTemp,cbTemp,则aspx.cs文件示范程序如下:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if(e.Row.RowIndex < 0) //如果正在生成表头
return;
DataRowView drv = (DataRowView)e.Row.DataItem; //将绑定当前行的数据行视图取出
Image img = (Image)e.Row.FindControl("imgTemp");
img.ImageUrl = drv["ImageUrl"].ToString(); //假定数据表中有一个ImageUrl的字段
Button btn = (Button)e.Row.FindControl("btnTemp");
btn.Text = drv["CompanyName"].ToString();
CheckBox cb = (CheckBox)e.Row.FindControl("cbTemp");
cb.Checked = (drv["IsSelect"].ToString() == "1" ? true : false); //假定数据表中有一个IsSelect字段,1表示选中,0表示未选中。
}
上面这段程序是一个示范,并不是完全按照示范表Customer表中的字段进行设置。其过程为:
1.将e.Row.DataItem强制转换为DataRowView对象,这个对象就是绑定到此行的数据表DataTable中的一条DataRow的视图,其用法与DataRow类似。
2.通过e.Row.FindControl方法找到指定ID的那个模板中的控件
3.通过一定的计算,将DataRowView中的值转换为控件的属性。
不仅模板列可以在RowDataBound事件中进行操作,常规列也可以,但不是用FindControl方法,以下例为示范,要获取第2列公司名称这个HyperLinkField类型的常规列中的HyperLink对象,在RowDataBound事件中写下面这行程序:
HyperLink hl = (HyperLink)e.Row.Cells[1].Controls[0];
因为此列位于该表的第二列,因此Cells[1]表示该单元格,此单元格中只有一个控件,因此为Controls[0]。
再如:在删除动作列中的删除按钮上加一个JavaScript动作,每次点击删除按钮时,先在页面通过JavaScript弹出一个确认对话框,可以按如下步骤操作:
1.在列编辑对话框中添加一个“删除”按钮列,按钮类型为Button,假定是在表格的第4列
2.在RowDataBound中如此写:
Button btDel = (Button)e.Row.Cells[3].Controls[0];
bt.Attributes.Add("OnClick", "return confirm('您是否确认删除此条记录?')");
在浏览器中查看此表格的HTML源码时,就会发现每一个删除按钮都有如此一段HTML属性:
OnClick="return confirm('您是否确认删除此条记录?')"
return confirm('.....')是一句JavaScript语句,根据用户在弹出的对话框中选择的项来决定返回的值,如果选择“是”,则返回true,则此按钮所触发的提交表单继续进行;反之,返回false,则此按钮所触发的提交表单事情停止,删除动作就不会完成。
六、DataKeys属性
GridView有一个DataKeys属性会经常用到,这里单独讲一下。比如:有一个删除按钮列,点击删除后,要删除当前行,但是你怎么从后台程序中获取到当前行的关键字段的值呢?方法有多种,但最可靠的方法还是通过GridView的DataKeys属性。下面程序是示范:
1.在进行数据绑定之时,设置DataKeyNames属性的值:
this.GridView1.DataSource = ds.Tables[0];
this.GridView1.DataKeyNames = new string[] { "CustomerID", "CompanyName" };
this.GridView1.DataBind();
此行程序的作用是将CustomerID和CompanyName两个字段的值放入到DataKeys数组中。
2.在GridView1_RowDeleting事件中写如下程序:
string id = this.GridView1.DataKeys[e.RowIndex]["CustomerID"].ToString();
string name = this.GridView1.DataKeys[e.RowIndex]["CompanyName"].ToString();
这样就获取到了当前行记录在DataKeys数组中的值。
七、事件
DataBinding 当服务器控件绑定到数据源时发生。(从 Control 继承。)
DataBound 在服务器控件绑定到数据源后发生。(从 BaseDataBoundControl 继承。)
Disposed 当从内存释放服务器控件时发生,这是请求 ASP.NET 页时服务器控件生存期的最后阶段。(从 Control 继承。)
Init 当服务器控件初始化时发生;初始化是控件生存期的第一步。(从 Control 继承。)
Load 当服务器控件加载到 Page 对象中时发生。(从 Control 继承。)
PageIndexChanged 在单击某一页导航按钮时,但在 GridView 控件处理分页操作之后发生。
PageIndexChanging 在单击某一页导航按钮时,但在 GridView 控件处理分页操作之前发生。
PreRender 在加载 Control 对象之后、呈现之前发生。(从 Control 继承。)
RowCancelingEdit 单击编辑模式中某一行的“取消”按钮以后,在该行退出编辑模式之前发生。
RowCommand 当单击 GridView 控件中的按钮时发生。
RowCreated 在 GridView 控件中创建行时发生。
RowDataBound 在 GridView 控件中将数据行绑定到数据时发生。
RowDeleted 在单击某一行的“删除”按钮时,但在 GridView 控件删除该行之后发生。
RowDeleting 在单击某一行的“删除”按钮时,但在 GridView 控件删除该行之前发生。
RowEditing 发生在单击某一行的“编辑”按钮以后,GridView 控件进入编辑模式之前。
RowUpdated 发生在单击某一行的“更新”按钮,并且 GridView 控件对该行进行更新之后。
RowUpdating 发生在单击某一行的“更新”按钮以后,GridView 控件对该行进行更新之前。
SelectedIndexChanged 发生在单击某一行的“选择”按钮,GridView 控件对相应的选择操作进行处理之后。
SelectedIndexChanging 发生在单击某一行的“选择”按钮以后,GridView 控件对相应的选择操作进行处理之前。
Sorted 在单击用于列排序的超链接时,但在 GridView 控件对相应的排序操作进行处理之后发生。
Sorting 在单击用于列排序的超链接时,但在 GridView 控件对相应的排序操作进行处理之前发生。
Unload 当服务器控件从内存中卸载时发生。(从 Control 继承。)
2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;
3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..
4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)
5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b
6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;
8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2
9、说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)
10、说明:两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )
11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....
12、说明:日程安排提前五分钟提醒
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5
13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
14、说明:前10条记录
select top 10 * form table1 where 范围
15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)
16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)
17、说明:随机取出10条数据
select top 10 * from tablename order by newid()
18、说明:随机选择记录
select newid()
19、说明:删除重复记录
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)
20、说明:列出数据库里所有的表名
select name from sysobjects where type='U'
21、说明:列出表里的所有的
select name from syscolumns where id=object_id('TableName')
22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs
电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3
23、说明:初始化表table1
TRUNCATE TABLE table1
24、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
三、技巧
1、1=1,1=2的使用,在SQL语句组合时用的较多
“where 1=1” 是表示选择全部 “where 1=2”全部不选,
如:
if @strWhere !=''
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere
end
else
begin
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'
end
我们可以直接写成
set @strSQL = 'select count(*) as Total from [' + @tblName + '] where 1=1 安定 '+ @strWhere
2、收缩数据库
--重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
--收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE
3、压缩数据库
dbcc shrinkdatabase(dbname)
4、转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname'
go
5、检查备份集
RESTORE VERIFYONLY from disk='E:\dvbbs.bak'
6、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO
7、日志清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT
USE tablename -- 要操作的数据库名
SELECT @LogicalFileName = 'tablename_log', -- 日志文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 1 -- 你想设定的日志文件的大小(M)
-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)
DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log')
DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF
8、说明:更改某个表
exec sp_changeobjectowner 'tablename','dbo'
9、存储更改全部表
CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS
DECLARE @Name as NVARCHAR(128)
DECLARE @Owner as NVARCHAR(128)
DECLARE @OwnerName as NVARCHAR(128)
DECLARE curObject CURSOR FOR
select 'Name' = name,
'Owner' = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name
OPEN curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN
if @Owner=@OldOwner
begin
set @OwnerName = @OldOwner + '.' + rtrim(@Name)
exec sp_changeobjectowner @OwnerName, @NewOwner
end
-- select @name,@NewOwner,@OldOwner
FETCH NEXT FROM curObject INTO @Name, @Owner
END
close curObject
deallocate curObject
GO
10、SQL SERVER中直接循环写入数据
declare @i int
set @i=1
while @i<30
begin
insert into test (userid) values(@i)
set @i=@i+1
end