您的位置:首页 > 编程语言

经典短小代码收集

2008-09-22 15:09 459 查看
经典短小代码收集SQLcode
createtabletz2008_1_1(idint,namevarchar(50))
insertintotz2008_1_1select1,'a'
createtabletz2008_1_2(idint,namevarchar(50))
insertintotz2008_1_2select2,'b'
createtabletz2008_1_3(idint,namevarchar(50))
insertintotz2008_1_3select3,'c'

declare@sqlvarchar(8000)
select@sql=isnull(@sql+'unionall','')+'select*from['+name+']'
fromsysobjectswherextype='u'andnamelike'tz2008%'
exec(@sql)
模糊表名的联合查询..------------------------------------------------------------------------------------------------------------------------------------------------------------SQLcode
--查询表的默认值
ifobject_id('tb')isnotnull
droptabletb
go
createtabletb(idint,namevarchar(50)default'abc',numintdefault5)
insertintotb(id)select1
insertintotbselect1,'oo',100
insertintotb(id,name)select1,'oo'
go
declare@tbnamevarchar(50)
set@tbname='tb'--表名
select@tbnameastbname,c.nameascolname,replace(replace(replace(replace(b.[text],'(''',''),''')',''),'((',''),'))','')asdefaultvalue
fromsysconstraintsajoinsyscommentsbona.constid=b.id
joinsyscolumnscona.id=c.idanda.colid=c.colid
wherea.id=object_id(@tbname)andobject_name(a.constid)like'%df%'
----------------------------------------------------------------------------------------------------------------------------------------------SQLcode
--存储过程语句查询
ifobject_id('proc_ttt')isnotnull
dropprocproc_ttt
go
createprocproc_ttt
as
select1unionselect2
go

select[text]fromsyscomments
whereid=object_id('proc_ttt')

EXECSP_HELPTEXT'proc_ttt'
---------------------------------------------------------------------------------
SQLcode
--通过身份证获得户籍createfunctionf_getcityfromcid(@cidvarchar(18))returnsvarchar(50)asbegindeclare@acityvarchar(1000)set@acity='____,____,____,____,____,____,____,____,____,____,____,北京__,天津__,河北__,山西__,内蒙古_,____,____,____,____,____,辽宁__,吉林__,黑龙江_,____,____,____,____,____,____,____,上海__,江苏__,浙江__,安微__,福建__,江西__,山东__,____,____,____,河南__,湖北__,湖南__,广东__,广西__,海南__,____,____,____,重庆__,四川__,贵州__,云南__,西藏__,____,____,____,____,____,____,陕西__,甘肃__,青海__,宁夏__,新疆__,____,____,____,____,____,台湾__,____,____,____,____,____,____,____,____,____,香港__,澳门__,____,____,____,____,____,____,____,____,国外__,'set@cid=upper(@cid)IF(len(@cid)<>18ORpatindex('%[^0-9X]%',@cid)>0)RETURN'你小子骗我,这不是合法的身份证'IFsubstring(@acity,cast(left(@cid,2)asint)*5+1,4)=''RETURN'你小子骗我,这身份证的地区码不存在'RETURN'这小子是:'+replace(substring(@acity,cast(left(@cid,2)asint)*5+1,4),'_','')endgoselectdbo.f_getcityfromcid('32108519760502ttt9')/*--------------------------------------------------你小子骗我,这不是合法的身份证(所影响的行数为1行)*/selectdbo.f_getcityfromcid('32108519****026**9')/*--------------------------------------------------这小子是:江苏(所影响的行数为1行)*/dropfunctionf_getcityfromcid
--------------------------------------------------------------------------------------
SQLcode
--随机选择一个小于等于500的组合declare@tbtable(idint,numint)insertinto@tbselect1,1000insertinto@tbselect2,100insertinto@tbselect3,500insertinto@tbselect4,200insertinto@tbselect5,200insertinto@tbselect6,50insertinto@tbselect7,150insertinto@tbselect8,80insertinto@tbselect9,70declare@idtbtable(idint)declare@numint,@idint,@sumintset@sum=0while@sum<>500beginselecttop1@id=id,@num=numfrom@tbwherenum<=500orderbynewid()if@num=500insertinto@idtbselect@idelseifnotexists(select1from@idtbwhereid=@id)insertinto@idtbselect@idselect@sum=sum(num)from@tbwhereidin(selectidfrom@idtb)if(@sum>500)begindelete@idtbendendselect*from@tbwhereidin(selectidfrom@idtb)
-----------------------------------------------------------------------------------
SQLcode
/*标题:普通行列转换(version2.0)作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)时间:2008-03-09地点:广东深圳说明:普通行列转换(version1.0)仅针对sqlserver2000提供静态和动态写法,version2.0增加sqlserver2005的有关写法。问题:假设有张学生成绩表(tb)如下:姓名课程分数张三语文74张三数学83张三物理93李四语文74李四数学84李四物理94想变成(得到如下结果):姓名语文数学物理----------------李四748494张三748393-------------------*/createtabletb(姓名varchar(10),课程varchar(10),分数int)insertintotbvalues('张三','语文',74)insertintotbvalues('张三','数学',83)insertintotbvalues('张三','物理',93)insertintotbvalues('李四','语文',74)insertintotbvalues('李四','数学',84)insertintotbvalues('李四','物理',94)go--SQLSERVER2000静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)select姓名as姓名,max(case课程when'语文'then分数else0end)语文,max(case课程when'数学'then分数else0end)数学,max(case课程when'物理'then分数else0end)物理fromtbgroupby姓名--SQLSERVER2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)declare@sqlvarchar(8000)set@sql='select姓名'select@sql=@sql+',max(case课程when'''+课程+'''then分数else0end)['+课程+']'from(selectdistinct课程fromtb)asaset@sql=@sql+'fromtbgroupby姓名'exec(@sql)--SQLSERVER2005静态SQL。select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b--SQLSERVER2005动态SQL。declare@sqlvarchar(8000)select@sql=isnull(@sql+'],[','')+课程fromtbgroupby课程set@sql='['+@sql+']'exec('select*from(select*fromtb)apivot(max(分数)for课程in('+@sql+'))b')---------------------------------/*问题:在上述结果的基础上加平均分,总分,得到如下结果:姓名语文数学物理平均分总分--------------------------李四74849484.00252张三74839383.33250*/--SQLSERVER2000静态SQL。select姓名姓名,max(case课程when'语文'then分数else0end)语文,max(case课程when'数学'then分数else0end)数学,max(case课程when'物理'then分数else0end)物理,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名--SQLSERVER2000动态SQL。declare@sqlvarchar(8000)set@sql='select姓名'select@sql=@sql+',max(case课程when'''+课程+'''then分数else0end)['+课程+']'from(selectdistinct课程fromtb)asaset@sql=@sql+',cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名'exec(@sql)--SQLSERVER2005静态SQL。selectm.*,n.平均分,n.总分from(select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b)m,(select姓名,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名)nwherem.姓名=n.姓名--SQLSERVER2005动态SQL。declare@sqlvarchar(8000)select@sql=isnull(@sql+',','')+课程fromtbgroupby课程exec('selectm.*,n.平均分,n.总分from(select*from(select*fromtb)apivot(max(分数)for课程in('+@sql+'))b)m,(select姓名,cast(avg(分数*1.0)asdecimal(18,2))平均分,sum(分数)总分fromtbgroupby姓名)nwherem.姓名=n.姓名')droptabletb------------------------------------/*问题:如果上述两表互相换一下:即表结构和数据为:姓名语文数学物理张三74  83  93李四74  84  94想变成(得到如下结果):姓名课程分数------------李四语文74李四数学84李四物理94张三语文74张三数学83张三物理93--------------*/createtabletb(姓名varchar(10),语文int,数学int,物理int)insertintotbvalues('张三',74,83,93)insertintotbvalues('李四',74,84,94)go--SQLSERVER2000静态SQL。select*from(select姓名,课程='语文',分数=语文fromtbunionallselect姓名,课程='数学',分数=数学fromtbunionallselect姓名,课程='物理',分数=物理fromtb)torderby姓名,case课程when'语文'then1when'数学'then2when'物理'then3end--SQLSERVER2000动态SQL。--调用系统表动态生态。declare@sqlvarchar(8000)select@sql=isnull(@sql+'unionall','')+'select姓名,[课程]='+quotename(Name,'''')+',[分数]='+quotename(Name)+'fromtb'fromsyscolumnswherename!=N'姓名'andID=object_id('tb')--表名tb,不包含列名为姓名的其它列orderbycolidascexec(@sql+'orderby姓名')--SQLSERVER2005动态SQL。select姓名,课程,分数fromtbunpivot(分数for课程in([语文],[数学],[物理]))t--SQLSERVER2005动态SQL,同SQLSERVER2000动态SQL。--------------------/*问题:在上述的结果上加个平均分,总分,得到如下结果:姓名课程分数----------------李四语文74.00李四数学84.00李四物理94.00李四平均分84.00李四总分252.00张三语文74.00张三数学83.00张三物理93.00张三平均分83.33张三总分250.00------------------*/select*from(select姓名as姓名,课程='语文',分数=语文fromtbunionallselect姓名as姓名,课程='数学',分数=数学fromtbunionallselect姓名as姓名,课程='物理',分数=物理fromtbunionallselect姓名as姓名,课程='平均分',分数=cast((语文+数学+物理)*1.0/3asdecimal(18,2))fromtbunionallselect姓名as姓名,课程='总分',分数=语文+数学+物理fromtb)torderby姓名,case课程when'语文'then1when'数学'then2when'物理'then3when'平均分'then4when'总分'then5enddroptabletb
----------------------------------------------------------------------------------------
SQLcode--按某一字段分组取最大(小)值所在行的数据--(爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)2007-10-23于浙江杭州)/*数据如下:namevalmemoa2a2(a的第二个值)a1a1--a的第一个值a3a3:a的第三个值b1b1--b的第一个值b3b3:b的第三个值b2b2b2b2b2b4b4b4b5b5b5b5b5b5*/--创建表并插入数据:createtabletb(namevarchar(10),valint,memovarchar(20))insertintotbvalues('a',2,'a2(a的第二个值)')insertintotbvalues('a',1,'a1--a的第一个值')insertintotbvalues('a',3,'a3:a的第三个值')insertintotbvalues('b',1,'b1--b的第一个值')insertintotbvalues('b',3,'b3:b的第三个值')insertintotbvalues('b',2,'b2b2b2b2')insertintotbvalues('b',4,'b4b4')insertintotbvalues('b',5,'b5b5b5b5b5')go--一、按name分组取val最大的值所在行的数据。--方法1:selecta.*fromtbawhereval=(selectmax(val)fromtbwherename=a.name)orderbya.name--方法2:selecta.*fromtbawherenotexists(select1fromtbwherename=a.nameandval>a.val)--方法3:selecta.*fromtba,(selectname,max(val)valfromtbgroupbyname)bwherea.name=b.nameanda.val=b.valorderbya.name--方法4:selecta.*fromtbainnerjoin(selectname,max(val)valfromtbgroupbyname)bona.name=b.nameanda.val=b.valorderbya.name--方法5selecta.*fromtbawhere1>(selectcount(*)fromtbwherename=a.nameandval>a.val)orderbya.name/*namevalmemo-----------------------------------------a3a3:a的第三个值b5b5b5b5b5b5*/--二、按name分组取val最小的值所在行的数据。--方法1:selecta.*fromtbawhereval=(selectmin(val)fromtbwherename=a.name)orderbya.name--方法2:selecta.*fromtbawherenotexists(select1fromtbwherename=a.nameandval<a.val)--方法3:selecta.*fromtba,(selectname,min(val)valfromtbgroupbyname)bwherea.name=b.nameanda.val=b.valorderbya.name--方法4:selecta.*fromtbainnerjoin(selectname,min(val)valfromtbgroupbyname)bona.name=b.nameanda.val=b.valorderbya.name--方法5selecta.*fromtbawhere1>(selectcount(*)fromtbwherename=a.nameandval<a.val)orderbya.name/*namevalmemo-----------------------------------------a1a1--a的第一个值b1b1--b的第一个值*/--三、按name分组取第一次出现的行所在的数据。selecta.*fromtbawhereval=(selecttop1valfromtbwherename=a.name)orderbya.name/*namevalmemo-----------------------------------------a2a2(a的第二个值)b1b1--b的第一个值*/--四、按name分组随机取一条数据。selecta.*fromtbawhereval=(selecttop1valfromtbwherename=a.nameorderbynewid())orderbya.name/*namevalmemo-----------------------------------------a1a1--a的第一个值b5b5b5b5b5b5*/--五、按name分组取最小的两个(N个)valselecta.*fromtbawhere2>(selectcount(*)fromtbwherename=a.nameandval<a.val)orderbya.name,a.valselecta.*fromtbawherevalin(selecttop2valfromtbwherename=a.nameorderbyval)orderbya.name,a.valselecta.*fromtbawhereexists(selectcount(*)fromtbwherename=a.nameandval<a.valhavingCount(*)<2)orderbya.name/*namevalmemo-----------------------------------------a1a1--a的第一个值a2a2(a的第二个值)b1b1--b的第一个值b2b2b2b2b2*/--六、按name分组取最大的两个(N个)valselecta.*fromtbawhere2>(selectcount(*)fromtbwherename=a.nameandval>a.val)orderbya.name,a.valselecta.*fromtbawherevalin(selecttop2valfromtbwherename=a.nameorderbyvaldesc)orderbya.name,a.valselecta.*fromtbawhereexists(selectcount(*)fromtbwherename=a.nameandval>a.valhavingCount(*)<2)orderbya.name/*namevalmemo-----------------------------------------a2a2(a的第二个值)a3a3:a的第三个值b4b4b4b5b5b5b5b5b5*/--七,如果整行数据有重复,所有的列都相同。/*数据如下:namevalmemoa2a2(a的第二个值)a1a1--a的第一个值a1a1--a的第一个值a3a3:a的第三个值a3a3:a的第三个值b1b1--b的第一个值b3b3:b的第三个值b2b2b2b2b2b4b4b4b5b5b5b5b5b5*/--在sqlserver2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。--创建表并插入数据:createtabletb(namevarchar(10),valint,memovarchar(20))insertintotbvalues('a',2,'a2(a的第二个值)')insertintotbvalues('a',1,'a1--a的第一个值')insertintotbvalues('a',1,'a1--a的第一个值')insertintotbvalues('a',3,'a3:a的第三个值')insertintotbvalues('a',3,'a3:a的第三个值')insertintotbvalues('b',1,'b1--b的第一个值')insertintotbvalues('b',3,'b3:b的第三个值')insertintotbvalues('b',2,'b2b2b2b2')insertintotbvalues('b',4,'b4b4')insertintotbvalues('b',5,'b5b5b5b5b5')goselect*,px=identity(int,1,1)intotmpfromtbselectm.name,m.val,m.memofrom(selectt.*fromtmptwhereval=(selectmin(val)fromtmpwherename=t.name))mwherepx=(selectmin(px)from(selectt.*fromtmptwhereval=(selectmin(val)fromtmpwherename=t.name))nwheren.name=m.name)droptabletb,tmp/*namevalmemo-----------------------------------------a1a1--a的第一个值b1b1--b的第一个值(2行受影响)*/--在sqlserver2005中可以使用row_number函数,不需要使用临时表。--创建表并插入数据:createtabletb(namevarchar(10),valint,memovarchar(20))insertintotbvalues('a',2,'a2(a的第二个值)')insertintotbvalues('a',1,'a1--a的第一个值')insertintotbvalues('a',1,'a1--a的第一个值')insertintotbvalues('a',3,'a3:a的第三个值')insertintotbvalues('a',3,'a3:a的第三个值')insertintotbvalues('b',1,'b1--b的第一个值')insertintotbvalues('b',3,'b3:b的第三个值')insertintotbvalues('b',2,'b2b2b2b2')insertintotbvalues('b',4,'b4b4')insertintotbvalues('b',5,'b5b5b5b5b5')goselectm.name,m.val,m.memofrom(select*,px=row_number()over(orderbyname,val)fromtb)mwherepx=(selectmin(px)from(select*,px=row_number()over(orderbyname,val)fromtb)nwheren.name=m.name)droptabletb/*namevalmemo-----------------------------------------a1a1--a的第一个值b1b1--b的第一个值(2行受影响)*/
[code]------------------------------------------------------------------------------------------合并列值原著:邹建改编:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)2007-12-16广东深圳表结构,数据如下:idvalue-----------1aa1bb2aaa2bbb2ccc需要得到结果:idvalues-----------------1aa,bb2aaa,bbb,ccc即:groupbyid,求value的和(字符串相加)1.旧的解决方法(在sqlserver2000中只能用函数解决。)--1.创建处理函数createtabletb(idint,valuevarchar(10))insertintotbvalues(1,'aa')insertintotbvalues(1,'bb')insertintotbvalues(2,'aaa')insertintotbvalues(2,'bbb')insertintotbvalues(2,'ccc')goCREATEFUNCTIONdbo.f_str(@idint)RETURNSvarchar(8000)ASBEGINDECLARE@rvarchar(8000)SET@r=''SELECT@r=@r+','+valueFROMtbWHEREid=@idRETURNSTUFF(@r,1,1,'')ENDGO--调用函数SELECtid,value=dbo.f_str(id)FROMtbGROUPBYiddroptabletbdropfunctiondbo.f_str/*idvalue----------------------1aa,bb2aaa,bbb,ccc(所影响的行数为2行)*/--2、另外一种函数.createtabletb(idint,valuevarchar(10))insertintotbvalues(1,'aa')insertintotbvalues(1,'bb')insertintotbvalues(2,'aaa')insertintotbvalues(2,'bbb')insertintotbvalues(2,'ccc')go--创建一个合并的函数createfunctionf_hb(@idint)returnsvarchar(8000)asbegindeclare@strvarchar(8000)set@str=''select@str=@str+','+cast(valueasvarchar)fromtbwhereid=@idset@str=right(@str,len(@str)-1)return(@str)Endgo--调用自定义函数得到结果:selectdistinctid,dbo.f_hb(id)asvaluefromtbdroptabletbdropfunctiondbo.f_hb/*idvalue----------------------1aa,bb2aaa,bbb,ccc(所影响的行数为2行)*/2.新的解决方法(在sqlserver2005中用OUTERAPPLY等解决。)createtabletb(idint,valuevarchar(10))insertintotbvalues(1,'aa')insertintotbvalues(1,'bb')insertintotbvalues(2,'aaa')insertintotbvalues(2,'bbb')insertintotbvalues(2,'ccc')go--查询处理SELECT*FROM(SELECTDISTINCTidFROMtb)AOUTERAPPLY(SELECT[values]=STUFF(REPLACE(REPLACE((SELECTvalueFROMtbNWHEREid=A.idFORXMLAUTO),'<Nvalue="',','),'"/>',''),1,1,''))Ndroptabletb/*idvalues----------------------1aa,bb2aaa,bbb,ccc(2行受影响)*/--SQL2005中的方法2createtabletb(idint,valuevarchar(10))insertintotbvalues(1,'aa')insertintotbvalues(1,'bb')insertintotbvalues(2,'aaa')insertintotbvalues(2,'bbb')insertintotbvalues(2,'ccc')goselectid,[values]=stuff((select','+[value]fromtbtwhereid=tb.idforxmlpath('')),1,1,'')fromtbgroupbyid/*idvalues-------------------------------1aa,bb2aaa,bbb,ccc(2row(s)affected)*/droptabletb
----------------------------------------------------------------------------------------
分拆列值原著:邹建改编:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)2007-12-16广东深圳有表tb,如下:idvalue----------------------1aa,bb2aaa,bbb,ccc欲按id,分拆value列,分拆后结果如下:idvalue-------------------1aa1bb2aaa2bbb2ccc1.旧的解决方法(sqlserver2000)SELECTTOP8000id=IDENTITY(int,1,1)INTO#FROMsyscolumnsa,syscolumnsbSELECTA.id,SUBSTRING(A.[values],B.id,CHARINDEX(',',A.[values]+',',B.id)-B.id)FROMtbA,#BWHERESUBSTRING(','+A.[values],B.id,1)=','DROPTABLE#2.新的解决方法(sqlserver2005)createtabletb(idint,valuevarchar(30))insertintotbvalues(1,'aa,bb')insertintotbvalues(2,'aaa,bbb,ccc')goSELECTA.id,B.valueFROM(SELECTid,[value]=CONVERT(xml,'<root><v>'+REPLACE([value],',','</v><v>')+'</v></root>')FROMtb)AOUTERAPPLY(SELECTvalue=N.v.value('.','varchar(100)')FROMA.[value].nodes('/root/v')N(v))BDROPTABLEtb/*idvalue-----------------------------------------1aa1bb2aaa2bbb2ccc(5行受影响)*/
-------------------------------------------------------------------------------------------
SQLcode[code]日期的推算:(转邹老大的代码)DECLARE@dtdatetimeSET@dt=GETDATE()DECLARE@numberintSET@number=3--1.指定日期该年的第一天或最后一天--A.年的第一天SELECTCONVERT(char(5),@dt,120)+'1-1'--B.年的最后一天SELECTCONVERT(char(5),@dt,120)+'12-31'--2.指定日期所在季度的第一天或最后一天--A.季度的第一天SELECTCONVERT(datetime,CONVERT(char(8),DATEADD(Month,DATEPART(Quarter,@dt)*3-Month(@dt)-2,@dt),120)+'1')--B.季度的最后一天(CASE判断法)SELECTCONVERT(datetime,CONVERT(char(8),DATEADD(Month,DATEPART(Quarter,@dt)*3-Month(@dt),@dt),120)+CASEWHENDATEPART(Quarter,@dt)in(1,4)THEN'31'ELSE'30'END)--C.季度的最后一天(直接推算法)SELECTDATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1+DATEPART(Quarter,@dt)*3-Month(@dt),@dt),120)+'1')--3.指定日期所在月份的第一天或最后一天--A.月的第一天SELECTCONVERT(datetime,CONVERT(char(8),@dt,120)+'1')--B.月的最后一天SELECTDATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')--C.月的最后一天(容易使用的错误方法)SELECTDATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt))--4.指定日期所在周的任意一天SELECTDATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)--5.指定日期所在周的任意星期几--A.星期天做为一周的第1天SELECTDATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)--B.星期一做为一周的第1天SELECTDATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)----------------------------------------------------------------------------------
SQLcode
/*标题:分解字符串并查询相关数据作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)时间:2008-03-18地点:广东深圳说明:通过使用函数等方法分解字符串查询相关数据。问题:通过分解一个带某种符号分隔的字符串在数据库中查找相关数据。例如@str='1,2,3',查询下表得到记录1,4,5,6IDTypeID11,2,3,4,5,6,7,8,9,10,11,1222,333,7,8,942,654,566,7*/-----------------------------createtabletb(IDint,TypeIDvarchar(30))insertintotbvalues(1,'1,2,3,4,5,6,7,8,9,10,11,12')insertintotbvalues(2,'2,3')insertintotbvalues(3,'3,7,8,9')insertintotbvalues(4,'2,6')insertintotbvalues(5,'4,5')insertintotbvalues(6,'6,7')go-------------------------------如果仅仅是一个,如@str='1'.declare@strasvarchar(30)set@str='1'select*fromtbwherecharindex(','+@str+',',','+TypeID+',')>0select*fromtbwhere','+TypeID+','like'%,'+@str+',%'/*IDTypeID-----------------------------------------11,2,3,4,5,6,7,8,9,10,11,12(所影响的行数为1行)*/-------------------------------如果包含两个,如@str='1,2'.declare@strasvarchar(30)set@str='1,2'select*fromtbwherecharindex(','+left(@str,charindex(',',@str)-1)+',',','+typeid+',')>0orcharindex(','+substring(@str,charindex(',',@str)+1,len(@str))+',',','+typeid+',')>0select*fromtbwhere','+typeid+','like'%,'+left(@str,charindex(',',@str)-1)+',%'or','+typeid+','like'%,'+substring(@str,charindex(',',@str)+1,len(@str))+',%'/*IDTypeID-----------------------------------------11,2,3,4,5,6,7,8,9,10,11,1222,342,6(所影响的行数为3行)*/---------------------------------------------如果包含三个或四个,用PARSENAME函数来处理.declare@strasvarchar(30)set@str='1,2,3,4'select*fromtbwherecharindex(','+parsename(replace(@str,',','.'),4)+',',','+typeid+',')>0orcharindex(','+parsename(replace(@str,',','.'),3)+',',','+typeid+',')>0orcharindex(','+parsename(replace(@str,',','.'),2)+',',','+typeid+',')>0orcharindex(','+parsename(replace(@str,',','.'),1)+',',','+typeid+',')>0select*fromtbwhere','+typeid+','like'%,'+parsename(replace(@str,',','.'),4)+',%'or','+typeid+','like'%,'+parsename(replace(@str,',','.'),3)+',%'or','+typeid+','like'%,'+parsename(replace(@str,',','.'),2)+',%'or','+typeid+','like'%,'+parsename(replace(@str,',','.'),1)+',%'/*IDTypeID-----------------------------------------11,2,3,4,5,6,7,8,9,10,11,1222,333,7,8,942,654,5(所影响的行数为5行)*/-----------------------------------------如果超过四个,则只能使用函数或动态SQL来分解并查询数据。/*名称:fn_split函数.功能:实现字符串分隔功能的函数*/createfunctiondbo.fn_split(@inputstrvarchar(8000),@sepratorvarchar(10))returns@temptable(avarchar(200))asbegindeclare@iintset@inputstr=rtrim(ltrim(@inputstr))set@i=charindex(@seprator,@inputstr)while@i>=1begininsert@tempvalues(left(@inputstr,@i-1))set@inputstr=substring(@inputstr,@i+1,len(@inputstr)-@i)set@i=charindex(@seprator,@inputstr)endif@inputstr<>'/'insert@tempvalues(@inputstr)returnendgo--调用declare@strasvarchar(30)set@str='1,2,3,4,5'selectdistinctm.*fromtbm,(select*fromdbo.fn_split(@str,','))nwherecharindex(','+n.a+',',','+m.typeid+',')>0droptabletbdropfunctiondbo.fn_split/*IDTypeID-----------------------------------------11,2,3,4,5,6,7,8,9,10,11,1222,333,7,8,942,654,5(所影响的行数为5行)*/--------------------------------------------使用动态SQL的语句。declare@strvarchar(200)declare@sqlasvarchar(1000)set@str='1,2,3,4,5'set@sql='select'''+replace(@str,',','''asidunionallselect''')set@sql=@sql+''''set@sql='selectdistincta.*fromtba,('+@sql+')bwherecharindex('+''',''+b.id+'+''','''+','+''',''+a.typeid+'+''','''+')>0'exec(@sql)/*IDTypeID-----------------------------------------11,2,3,4,5,6,7,8,9,10,11,1222,333,7,8,942,654,5(所影响的行数为5行)*/
--------------------------------------------------------------------------------------------
SQLcode[code]/*本文由微软新闻组摘录下来的。一段非常有用的脚本。如果碰到日志文件过大的问题,用SHIRNKDATABASE,TRUNCATELOGFILE不是很有效时,可以考虑试下下面的脚本。把代码COPY到查询分析器里,然后修改其中的3个参数(数据库名,日志文件名,和目标日志文件的大小),运行即可*/----------------------------------------------------------------------------------SETNOCOUNTONDECLARE@LogicalFileNamesysname,--日志文件名@MaxMinutesINT,--允许此脚本执行的最长时间@NewSizeINT--目标日志文件的大小USECRM--要操作的数据库名SELECT@LogicalFileName='CRM_LOG',--日志文件名@MaxMinutes=10,--Limitontimeallowedtowraplog.@NewSize=1--想要收缩到的目标大小(单位M),此处标记收缩到1MDECLARE@OriginalSizeintSELECT@OriginalSize=sizeFROMsysfilesWHEREname=@LogicalFileNameSELECT'OriginalSizeof'+db_name()+'LOGis'+CONVERT(VARCHAR(30),@OriginalSize)+'8Kpagesor'+CONVERT(VARCHAR(30),(@OriginalSize*8/1024))+'MB'FROMsysfilesWHEREname=@LogicalFileNameCREATETABLEDummyTrans(DummyColumnchar(8000)notnull)DECLARE@CounterINT,@StartTimeDATETIME,@TruncLogVARCHAR(255)SELECT@StartTime=GETDATE(),@TruncLog='BACKUPLOG'+db_name()+'WITHTRUNCATE_ONLY'DBCCSHRINKFILE(@LogicalFileName,@NewSize)EXEC(@TruncLog)--Wrapthelogifnecessary.WHILE@MaxMinutes>DATEDIFF(mi,@StartTime,GETDATE())--timehasnotexpiredAND@OriginalSize=(SELECTsizeFROMsysfilesWHEREname=@LogicalFileName)AND(@OriginalSize*8/1024)>@NewSizeBEGIN--Outerloop.SELECT@Counter=0WHILE((@Counter<@OriginalSize/16)AND(@Counter<50000))BEGIN--updateINSERTDummyTransVALUES('FillLog')DELETEDummyTransSELECT@Counter=@Counter+1ENDEXEC(@TruncLog)ENDSELECT'FinalSizeof'+db_name()+'LOGis'+CONVERT(VARCHAR(30),size)+'8Kpagesor'+CONVERT(VARCHAR(30),(size*8/1024))+'MB'FROMsysfilesWHEREname=@LogicalFileNameDROPTABLEDummyTransSETNOCOUNTOFF----------------------------------------------------------------------------------------------
SQLcode[code]--递归删除父节点及所有子节点createtabletb(Idint,ParentIdint,Namevarchar(5))insertintotbselect1,0,'a1'unionallselect2,2,'a2'unionallselect14,1,'b11'unionallselect15,1,'b12'unionallselect16,14,'c13'unionallselect17,14,'c14'unionallselect104,17,'d15'goWITHtemptab(id,parentid,name)AS(SELECTroot.id,root.parentid,root.nameFROMtbrootWHEREid=1UNIONALLSELECTsub.id,sub.parentid,sub.nameFROMtbsub,temptabsuperWHEREsub.parentid=super.id)deletefromtbwhereidin(selectidfromtemptab)select*fromtbgodroptabletb/*IdParentIdName---------------------------22a2
-----------------------------------------------------------------------------------------------
精妙SQL语句明:复制表(只复制结构,源表名:a新表名:b)SQL:select*intobfromawhere1<>1说明:拷贝表(拷贝数据,源表名:a目标表名:b)SQL:insertintob(a,b,c)selectd,e,ffromb;说明:显示文章、提交人和最后回复时间SQL:selecta.title,a.username,b.adddatefromtablea,(selectmax(adddate)adddatefromtablewheretable.title=a.title)b说明:外连接查询(表名1:a表名2:b)SQL:selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOINbONa.a=b.c说明:日程安排提前五分钟提醒SQL:select*from日程安排wheredatediff(<|>minute<|>,f开始时间,getdate())>5说明:两张关联表,删除主表中已经在副表中没有的信息SQL:deletefrominfowherenotexists(select*frominfobzwhereinfo.infid=infobz.infid)说明:--SQL:SELECTA.NUM,A.NAME,B.UPD_DATE,B.PREV_UPD_DATEFROMTABLE1,(SELECTX.NUM,X.UPD_DATE,Y.UPD_DATEPREV_UPD_DATEFROM(SELECTNUM,UPD_DATE,INBOUND_QTY,STOCK_ONHANDFROMTABLE2WHERETO_CHAR(UPD_DATE,<|>YYYY/MM<|>)=TO_CHAR(SYSDATE,<|>YYYY/MM<|>))X,(SELECTNUM,UPD_DATE,STOCK_ONHANDFROMTABLE2WHERETO_CHAR(UPD_DATE,<|>YYYY/MM<|>)=TO_CHAR(TO_DATE(TO_CHAR(SYSDATE,<|>YYYY/MM<|>)||<|>/01<|>,<|>YYYY/MM/DD<|>)-1,<|>YYYY/MM<|>))Y,WHEREX.NUM=Y.NUM(+)ANDX.INBOUND_QTY+NVL(Y.STOCK_ONHAND,0)<>X.STOCK_ONHAND)BWHEREA.NUM=B.NUM说明:--SQL:select*fromstudentinfowherenotexists(select*fromstudentwherestudentinfo.id=student.id)and系名称=<|>"&strdepartmentname&"<|>and专业名称=<|>"&strprofessionname&"<|>orderby性别,生源地,高考总成绩说明:从数据库中去一年的各单位电话费统计(电话费定额贺电化肥清单两个表来源)SQL:SELECTa.userper,a.tel,a.standfee,TO_CHAR(a.telfeedate,<|>yyyy<|>)AStelyear,SUM(decode(TO_CHAR(a.telfeedate,<|>mm<|>),<|>01<|>,a.factration))ASJAN,SUM(decode(TO_CHAR(a.telfeedate,<|>mm<|>),<|>02<|>,a.factration))ASFRI,SUM(decode(TO_CHAR(a.telfeedate,<|>mm<|>),<|>03<|>,a.factration))ASMAR,SUM(decode(TO_CHAR(a.telfeedate,<|>mm<|>),<|>04<|>,a.factration))ASAPR,SUM(decode(TO_CHAR(a.telfeedate,<|>mm<|>),<|>05<|>,a.factration))ASMAY,SUM(decode(TO_CHAR(a.telfeedate,<|>mm<|>),<|>06<|>,a.factration))ASJUE,SUM(decode(TO_CHAR(a.telfeedate,<|>mm<|>),<|>07<|>,a.factration))ASJUL,SUM(decode(TO_CHAR(a.telfeedate,<|>mm<|>),<|>08<|>,a.factration))ASAGU,SUM(decode(TO_CHAR(a.telfeedate,<|>mm<|>),<|>09<|>,a.factration))ASSEP,SUM(decode(TO_CHAR(a.telfeedate,<|>mm<|>),<|>10<|>,a.factration))ASOCT,SUM(decode(TO_CHAR(a.telfeedate,<|>mm<|>),<|>11<|>,a.factration))ASNOV,SUM(decode(TO_CHAR(a.telfeedate,<|>mm<|>),<|>12<|>,a.factration))ASDECFROM(SELECTa.userper,a.tel,a.standfee,b.telfeedate,b.factrationFROMTELFEESTANDa,TELFEEbWHEREa.tel=b.telfax)aGROUPBYa.userper,a.tel,a.standfee,TO_CHAR(a.telfeedate,<|>yyyy<|>)说明:四表联查问题:SQL:select*fromaleftinnerjoinbona.a=b.brightinnerjoincona.a=c.cinnerjoindona.a=d.dwhere.....说明:得到表中最小的未使用的ID号SQL:SELECT(CASEWHENEXISTS(SELECT*FROMHandlebWHEREb.HandleID=1)THENMIN(HandleID)+1ELSE1END)asHandleIDFROMHandleWHERENOTHandleIDIN(SELECTa.HandleID-1FROMHandlea)
-----------------------------------------------------------------------------------------------
不足5位数补零的方法publicstringgetNumberString(intn){if(n.ToString().Length<5){return(1000000+n).ToString().SubString(1);}returnn.ToString();}
--------------------------------------------------------------------------------------
ip各段内容提取,类似有3或4段字串通过一特殊字符连接的字串提取-----------------------------------declare@avarchar(50)set@a='192.168.1.123'SELECTPARSENAME(@a,1),PARSENAME(@a,2),PARSENAME(@a,3),PARSENAME(@a,4)set@a='100,200,300'SELECTPARSENAME(replace(@a,',','.'),1)高,PARSENAME(replace(@a,',','.'),2)宽,PARSENAME(replace(@a,',','.'),3)长
----------------------------------------------------------------------------------------------
--备份declare@sqlvarchar(8000)set@sql='backupdatabasemistodisk=''d:/databack/mis/mis'+rtrim(convert(varchar,getdate(),112))+'.bak'''exec(@sql)--删除15天前备份文件set@sql='deld:/databack/mis/mis'+rtrim(convert(varchar,getdate()-15,112))+'.bak'''execmaster..xp_cmdshell@sql
-----------------------------------------------------------------------------------------------
求字串中所含某字符或某子串的个数declare@avarchar(100),@bvarchar(20)select@a='abcdefbcmnbcde',@b='bc'select(len(@a)-len(replace(@a,@b,'')))/len(@b)
-----------------------------------------------------------------------------------------------
对查询结果进行随机排序select*fromdbo.Classorderbynewid()
-----------------------------------------------------------------------------------------------
*--比较两个数据库的表结构差异--*//*--调用示例execp_comparestructure'xzkh_model','xzkh_new'--*/ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_comparestructure]')andOBJECTPROPERTY(id,N'IsProcedure')=1)dropprocedure[dbo].[p_comparestructure]GOcreateprocp_comparestructure@dbname1varchar(250),--要比较的数据库名1@dbname2varchar(250)--要比较的数据库名2ascreatetable#tb1(表名1varchar(250),字段名varchar(250),序号int,标识bit,主键bit,类型varchar(250),占用字节数int,长度int,小数位数int,允许空bit,默认值varchar(500),字段说明varchar(500))createtable#tb2(表名2varchar(250),字段名varchar(250),序号int,标识bit,主键bit,类型varchar(250),占用字节数int,长度int,小数位数int,允许空bit,默认值varchar(500),字段说明varchar(500))--得到数据库1的结构exec('insertinto#tb1SELECT表名=d.name,字段名=a.name,序号=a.colid,标识=casewhena.status=0x80then1else0end,主键=casewhenexists(SELECT1FROM'+@dbname1+'..sysobjectswherextype=''PK''andnamein(SELECTnameFROM'+@dbname1+'..sysindexesWHEREindidin(SELECTindidFROM'+@dbname1+'..sysindexkeysWHEREid=a.idANDcolid=a.colid)))then1else0end,类型=b.name,占用字节数=a.length,长度=a.prec,小数位数=a.scale,允许空=a.isnullable,默认值=isnull(e.text,''''''),字段说明=isnull(g.[value],'''''')FROM'+@dbname1+'..syscolumnsaleftjoin'+@dbname1+'..systypesbona.xtype=b.xusertypeinnerjoin'+@dbname1+'..sysobjectsdona.id=d.idandd.xtype=''U''andd.name<>''dtproperties''leftjoin'+@dbname1+'..syscommentseona.cdefault=e.idleftjoin'+@dbname1+'..syspropertiesgona.id=g.idanda.colid=g.smallidorderbya.id,a.colorder')--得到数据库2的结构exec('insertinto#tb2SELECT表名=d.name,字段名=a.name,序号=a.colid,标识=casewhena.status=0x80then1else0end,主键=casewhenexists(SELECT1FROM'+@dbname2+'..sysobjectswherextype=''PK''andnamein(SELECTnameFROM'+@dbname2+'..sysindexesWHEREindidin(SELECTindidFROM'+@dbname2+'..sysindexkeysWHEREid=a.idANDcolid=a.colid)))then1else0end,类型=b.name,占用字节数=a.length,长度=a.prec,小数位数=a.scale,允许空=a.isnullable,默认值=isnull(e.text,''''''),字段说明=isnull(g.[value],'''''')FROM'+@dbname2+'..syscolumnsaleftjoin'+@dbname2+'..systypesbona.xtype=b.xusertypeinnerjoin'+@dbname2+'..sysobjectsdona.id=d.idandd.xtype=''U''andd.name<>''dtproperties''leftjoin'+@dbname2+'..syscommentseona.cdefault=e.idleftjoin'+@dbname2+'..syspropertiesgona.id=g.idanda.colid=g.smallidorderbya.id,a.colorder')--andnotexists(select1from#tb2where表名2=a.表名1)select比较结果=casewhena.表名1isnullandb.序号=1then'库1缺少表:'+b.表名2whenb.表名2isnullanda.序号=1then'库2缺少表:'+a.表名1whena.字段名isnullandexists(select1from#tb1where表名1=b.表名2)then'库1['+b.表名2+']缺少字段:'+b.字段名whenb.字段名isnullandexists(select1from#tb2where表名2=a.表名1)then'库2['+a.表名1+']缺少字段:'+a.字段名whena.标识<>b.标识then'标识不同'whena.主键<>b.主键then'主键设置不同'whena.类型<>b.类型then'字段类型不同'whena.占用字节数<>b.占用字节数then'占用字节数'whena.长度<>b.长度then'长度不同'whena.小数位数<>b.小数位数then'小数位数不同'whena.允许空<>b.允许空then'是否允许空不同'whena.默认值<>b.默认值then'默认值不同'whena.字段说明<>b.字段说明then'字段说明不同'else''end,*from#tb1afulljoin#tb2bona.表名1=b.表名2anda.字段名=b.字段名wherea.表名1isnullora.字段名isnullorb.表名2isnullorb.字段名isnullora.标识<>b.标识ora.主键<>b.主键ora.类型<>b.类型ora.占用字节数<>b.占用字节数ora.长度<>b.长度ora.小数位数<>b.小数位数ora.允许空<>b.允许空ora.默认值<>b.默认值ora.字段说明<>b.字段说明orderbyisnull(a.表名1,b.表名2),isnull(a.序号,b.序号)--isnull(a.字段名,b.字段名)go
--------------------------------------------------------------------------------------------
SQLcode[code]--查看数据库中所有的表sp_MSforeachtable'SelectTop1*From?'--所有数据库的sp_MSforeachdb
---------------------------------------------------------------------------------------------
SQLcode
select@@version
----------------------------------------------------------------------------------------------
SQLcode
--功能概述:重新编译一个表上的所有索引alterindexallonorder_masterrebuild
-----------------------------------------------------------------------------------------------
SQLcode--功能概述:显示某一表的结构DECLARE@tableNamenvarchar(100)SET@tableName='brand'--mssql2005SELECT(CASEWHENa.colorder=1THENd.nameELSE''END)表名,a.colorder字段序号,a.name字段名,(CASEWHENCOLUMNPROPERTY(a.id,a.name,'IsIdentity')=1THEN'√'ELSE''END)标识,(CASEWHEN(SELECTCOUNT(*)FROMsysobjectsWHERE(nameIN(SELECTnameFROMsysindexesWHERE(id=a.id)AND(indidIN(SELECTindidFROMsysindexkeysWHERE(id=a.id)AND(colidIN(SELECTcolidFROMsyscolumnsWHERE(id=a.id)AND(name=a.name)))))))AND(xtype='PK'))>0THEN'√'ELSE''END)主键,b.name类型,a.length占用字节数,COLUMNPROPERTY(a.id,a.name,'PRECISION')AS长度,ISNULL(COLUMNPROPERTY(a.id,a.name,'Scale'),0)AS小数位数,(CASEWHENa.isnullable=1THEN'√'ELSE''END)允许空,ISNULL(e.text,'')默认值,ISNULL(g.[value],'')AS字段说明FROMsyscolumnsaLEFTJOINsystypesbONa.xtype=b.xusertypeINNERJOINsysobjectsdONa.id=d.idANDd.xtype='U'ANDd.name<>'dtproperties'LEFTJOINsyscommentseONa.cdefault=e.idLEFTJOINsys.extended_propertiesgONa.id=g.major_idANDa.colid=g.major_idWHEREd.name=@tableNameORDERBYa.id,a.colorder
-----------------------------------------------------------------------------------------------1、说明:复制表(只复制结构,源表名:a新表名:b)(Access可用)法一:select*intobfromawhere1<>1法二:selecttop0*intobfroma2、说明:拷贝表(拷贝数据,源表名:a目标表名:b)(Access可用)insertintob(a,b,c)selectd,e,ffromb;3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径)(Access可用)insertintob(a,b,c)selectd,e,ffrombin‘具体数据库’where条件例子:..frombin'"&Server.MapPath(".")&"/data.mdb"&"'where..4、说明:子查询(表名1:a表名2:b)selecta,b,cfromawhereaIN(selectdfromb)或者:selecta,b,cfromawhereaIN(1,2,3)5、说明:显示文章、提交人和最后回复时间selecta.title,a.username,b.adddatefromtablea,(selectmax(adddate)adddatefromtablewheretable.title=a.title)b6、说明:外连接查询(表名1:a表名2:b)selecta.a,a.b,a.c,b.c,b.d,b.ffromaLEFTOUTJOINbONa.a=b.c7、说明:在线视图查询(表名1:a)select*from(SELECTa,b,cFROMa)Twheret.a>1;8、说明:between的用法,between限制查询数据范围时包括了边界值,notbetween不包括select*fromtable1wheretimebetweentime1andtime2selecta,b,c,fromtable1whereanotbetween数值1and数值29、说明:in的使用方法select*fromtable1wherea[not]in(‘值1’,’值2’,’值4’,’值6’)10、说明:两张关联表,删除主表中已经在副表中没有的信息deletefromtable1wherenotexists(select*fromtable2wheretable1.field1=table2.field1)11、说明:四表联查问题:select*fromaleftinnerjoinbona.a=b.brightinnerjoincona.a=c.cinnerjoindona.a=d.dwhere.....12、说明:日程安排提前五分钟提醒SQL:select*from日程安排wheredatediff('minute',f开始时间,getdate())>513、说明:一条sql语句搞定数据库分页selecttop10b.*from(selecttop20主键字段,排序字段from表名orderby排序字段desc)a,表名bwhereb.主键字段=a.主键字段orderbya.排序字段14、说明:前10条记录selecttop10*formtable1where范围15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)selecta,b,cfromtablenametawherea=(selectmax(a)fromtablenametbwheretb.b=ta.b)16、说明:包括所有在TableA中但不在TableB和TableC中的行并消除所有重复行而派生出一个结果表(selectafromtableA)except(selectafromtableB)except(selectafromtableC)17、说明:随机取出10条数据selecttop10*fromtablenameorderbynewid()18、说明:随机选择记录selectnewid()19、说明:删除重复记录Deletefromtablenamewhereidnotin(selectmax(id)fromtablenamegroupbycol1,col2,...)20、说明:列出数据库里所有的表名selectnamefromsysobjectswheretype='U'21、说明:列出表里的所有的selectnamefromsyscolumnswhereid=object_id('TableName')22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select中的case。selecttype,sum(casevenderwhen'A'thenpcselse0end),sum(casevenderwhen'C'thenpcselse0end),sum(casevenderwhen'B'thenpcselse0end)FROMtablenamegroupbytype显示结果:typevenderpcs电脑A1电脑A1光盘B2光盘A2手机B3手机C323、说明:初始化表table1TRUNCATETABLEtable124、说明:选择从10到15的记录selecttop5*from(selecttop15*fromtableorderbyidasc)table_别名orderbyiddesc-----------------------------------------------------------------------------------------------SQLcode--改变用户的锁定状态(可适合一切bit类型的字段)UPDATEtb_TableSETIsLook=Abs(IsLook-1)WHEREId=@id
-----------------------------------------------------------------------------------------------
/*08.09.20知识点:SQL函数主要分为两中类型1.单行函数(也叫标量函数)2.多行函数标量函数:对单一值操作,返回单一值。只要表达式有效即可使用标量函数。我们把标量函数的分类列出来:配置函数返回当前配置信息游标函数返回游标信息日期和时间函数对日期和时间输入值进行操作,返回一个字符串、数字或日期和时间值数学函数对作为函数参数提供的输入值进行计算,返回一个数字值元数据函数返回有关数据库和数据库对象的信息安全函数返回有关用户和角色的信息字符串函数对字符串(char或varchar)输入值执行操作,返回一个字符串或数字值系统函数执行操作并返回有关MicrosoftSQLServer中的值、对象和设置的信息系统统计函数返回系统的统计信息文本和图象函数对文本或图象进行操作并返回有关信息聚合函数是对一组值进行操作,跟标量函数不同.行集函数是可以向SQL语句中表引用一样使用,具体看文档了....下面具体看例子了*/selectemp_id,UPPER(lname),job_idfromemployeewherelname='chang'/*大小写处理函数*/selectemp_id,LOWER(lname),job_idfromemployeewherelname='chang'selectemp_id,fname+lnameNAME,/*使用字符处理函数*/job_id,LEN(lname)Length,CHARINDEX('a',lname)"Contains'a'?"fromemployeewhereSUBSTRING(emp_id,1,2)='MA'/*运算符+:连接值在一起substring:选取给定位置和长度的子字符串len:以数字值显示一个字符串的长度charIndex:找到一个给定字符的数字位置Replicate:用给定的字符替换给定长度的字符串Ltrim和Rtrim:从一个字符串中去除头或尾的字符*/selectROUND(2008.092023,2),/*数字函数ROUND四舍五入*/ROUND(2008.092023,0),ROUND(2008.092023,-1)/*注意奇数偶数的进位不同它也可以用语日期函数处理*/selectlname,job_lvl,job_lvl%50/*使用%(模)函数经常用与确定一个值是奇数还是偶数*/fromemployeewherejob_lvl=5selectlname,hire_date/*日期的使用*/fromemployeewherelnamelike'A%'selectlname,hire_date+365AS"OneYear"/*用日期做算术运算该例显示所有job_id=10的雇员的名字和其受雇满一年的日期*/fromemployeewherejob_id=10selectlname,/*CONVERT函数用于日期转换*/CONVERT(varchar(10),hire_date,20)ASHIREDATEfromemployeeselectSUBSTRING(title,1,30)ASTitle,ytd_sales/*对数字使用CAST函数*/fromtitleswhereCAST(ytd_salesASchar(20))LIKE'3%'/*检索书名:这些图书的截止当前销售额的第一数字为3,并将这些图书的ytd_sales转换为char(20)CAST(number,数据类型)*/selectCONVERT(varchar(10),price,0)PRICE/*对数字使用CONVERT函数*/fromtitleswheretitle_id='BU1111'selectCAST('2008-09-2023:57'ASdatetime)/*使用CAST或CONVERT函数转换字符串到日期*/selectCONVERT(datetime,'2008-09-2023:59')selecttitle,ytd_sales/*使用带有LIKE子句的CAST*/fromtitleswhereCAST(ytd_salesASchar(20))LIKE'15%'ANDtype='trad_cook'selecttitle,ISNULL(price,0)Price,/*使用ISNULL函数*/ISNULL(price*12,0)'TenPrice'fromtitles/*为了计算所有图书的价格,在进行算术运算之前必须转换空值为一个数,ISNULL函数用来转换空值为零*/select/*使用CASE表达式*/CASEwhenpriceISNULLTHEN'Notyetpriced'whenprice<10THEN'VeryReasonableTitle'whenprice>=10andprice<20THEN'CoffeeTableTitle'else'Expensivebook!'ENDAS'PriceCategory',/*这个逗号不敢忘*/CONVERT(varchar(20),title)AS"shorttenedTitle"frompubs.dbo.titlesORDERBYprice/*使用CASE表达式使得if-then-else条件判断很容易实现*/select/*使用CASE处理条件数据*/CASEtypewhen'popular_comp'then'PopularComputing'when'mod_cook'then'ModernCoking'when'business'then'Business'when'psychology'then'Psychology'when'trad_cook'then'TraditionalCooking'else'Notyetcategorized'ENDASCategory,CONVERT(varchar(30),titles)AS"ShortenedTitle",PriceASpricefromtitleswherepriceISNOTNULLORDERBY1/*小结下:掌握用函数对数据的计算用函数修饰不同的数据项用函数改变数据格式用函数改变列数据类型使用ISNULL函数使用if-then-else逻辑*//*最后一个例子有问题先不管了掌握语法就OK*/
-----------------------------------------------------------------------------------------------
SQLcode
/*08.09.20*/select*fromemployeeusemaster/*显示表结构*/execsp_helpdbGOusepubsexecsp_helpGOusepubsexecsp_helpemployeeGOselectlname,job_lvlfromemployeewherejob_lvl<=50selectlname,job_lvl/*使用BETWEEN条件*/fromemployeewherejob_lvlBETWEEN100AND200selectlname,job_id,job_lvl/*使用IN成员条件测试在列表中的值*/fromemployeewherejob_lvlIN(100,170,200)selectemp_id,lname,job_id,job_lvl/*使用NOT操作*/fromemployeewherejob_lvlNOTIN(100,170,200)selecttitle_id,title,type,pricefromtitleswherepriceISNULLselectlname,job_lvl,job_lvl/*优先规则AND在前*/fromemployeewherejob_lvl=5ORjob_lvl=7ANDjob_lvl>160selectlname,job_lvl,job_lvl/*用圆括号强制优先权*/fromemployeewhere(job_lvl=5ORjob_lvl=7)ANDjob_lvl>160selectlname,job_id,job_lvl,hire_date/*用ORDERBY子句进行排序(升序排列)*/fromemployeeORDERBYhire_dateselectlname,job_id,job_lvl,hire_date/*用DESC降序排列*/fromemployeeORDERBYhire_dateDESCselectemp_id,lname,job_lvl*2"Doublejob_lvl"/*用列别名排序*/fromemployeeORDERBY"Doublejob_lvl"selectlname,job_id,job_lvl/*多列排序*/fromemployeeORDERBYjob_id,job_lvlDESC/*小结下:主要掌握WHERE子句限制输出行使用比较条件使用BETWEEN,IN,AND,NOT,OR操作最后掌握使用ORDERBY子句排序输出行所有操作在数据库pubs里进行*/
-----------------------------------------------------------------------------------------------
SQLcode
/*标题:日期分表查询(version1.0)网名:悬崖边的舞者时间:2008-07-14地点:天津说明:以日期或月份分表进行多日、多月查询连表查询的有关写法*/CreateProcedureSearch@date1datetime,--起始时间@date2datetime--终止时间asdeclare@date1Newdatetime,@rqvarchar(6),@iint,--记录循环次数@svarchar(5000)--根据表多少可以扩大它set@rq=convert(varchar,@date1,12)--把时间格式化比如2008-06-20变成了080620set@s='select*fromsensor'+@rq--初始化@s='select*fromsensor080620'这样第一个表就有了set@i=datediff(d,@date1,@date2)--日期相减while@i>0begin--如果是非常重要的系统可以在这里加上该物理表是否存在的语句--ifexists(select*fromdbo.sysobjectswhere--id=object_id(N'c')andOBJECTPROPERTY(id,N'IsUserTable')=1)--begin--SELECT'存在'--endset@date1New=dateadd(day,@i,@date1)set@rq=convert(varchar,@date1New,12)--如果是按月进行查询就修改上面set@s=@s+'unionallselect*fromsensor'+@rqset@i=@i-1--累加endselect@s--exec(@S)goexecSearch'2008-06-2000:11:11.000','2008-07-2500:11:11.000'dropProcedureSearch
-----------------------------------------------------------------------------------------------
SQLcode[code]createtabletb(idvarchar(3),pidvarchar(3),namevarchar(10))insertintotbvalues('001',null,'广东省')insertintotbvalues('002','001','广州市')insertintotbvalues('003','001','深圳市')insertintotbvalues('004','002','天河区')insertintotbvalues('005','003','罗湖区')insertintotbvalues('006','003','福田区')insertintotbvalues('007','003','宝安区')insertintotbvalues('008','007','西乡镇')insertintotbvalues('009','007','龙华镇')insertintotbvalues('010','007','松岗镇')go--查询指定节点及其所有子节点的函数createfunctionf_cid(@IDvarchar(3))returns@t_leveltable(idvarchar(3),levelint)asbegindeclare@levelintset@level=1insertinto@t_levelselect@id,@levelwhile@@ROWCOUNT>0beginset@level=@level+1insertinto@t_levelselecta.id,@levelfromtba,@t_Levelbwherea.pid=b.idandb.level=@level-1endreturnendgo--调用函数查询001(广东省)及其所有子节点selecta.*fromtba,f_cid('001')bwherea.id=b.idorderbya.id/*idpidname------------------001NULL广东省002001广州市003001深圳市004002天河区005003罗湖区006003福田区007003宝安区008007西乡镇009007龙华镇010007松岗镇(所影响的行数为10行)*/--调用函数查询002(广州市)及其所有子节点selecta.*fromtba,f_cid('002')bwherea.id=b.idorderbya.id/*idpidname------------------002001广州市004002天河区(所影响的行数为2行)*/--调用函数查询003(深圳市)及其所有子节点selecta.*fromtba,f_cid('003')bwherea.id=b.idorderbya.id/*idpidname------------------003001深圳市005003罗湖区006003福田区007003宝安区008007西乡镇009007龙华镇010007松岗镇(所影响的行数为7行)*/droptabletbdropfunctionf_cid
-----------------------------------------------------------------------------------------------SQLcodesetANSI_NULLSONsetQUOTED_IDENTIFIERONgoALTERtrigger[tri_updatesalary_Mem_Type]on[dbo].[SalaryIncrease]afterinsertasdeclare@iintset@i=@@identityupdatemsetm.Mem_Type=casewhens.SMark>500000then'退休会员'--500000whens.SMark>400000then'钻石五级'--400000whens.SMark>300000then'钻石四级'--300000whens.SMark>200000then'钻石三级'--200000whens.SMark>100000then'钻石二级'--100000whens.SMark>50000then'钻石一级'--50000whens.SMark>40000then'五星级'--40000whens.SMark>30000then'四星级'--30000whens.SMark>20000then'三星级'--20000whens.SMark>10000then'二星级'--10000whens.SMark>5000then'一星级'--5000else'一般VIP会员'endfromMemberInfomjoin(selects.SCardName,sum(s.SMark)asSMarkfromSalaryIncreasesjoininsertedions.SCardName=i.SCardNamegroupbys.SCardName)sonm.Mem_Num=s.SCardName--ifexists(select*fromMemberInfomjoininsertedionm.Mem_Num=i.SCardNameandm.Mem_Mark>100)ifexists(selectm.SCardName,sum(m.ShopMark)asmarkfrom(selectm.SCardName,m.ShopMarkfromShoppingMarkmjoininsertedionm.SCardName=i.SCardNamewhereyear(m.SDate)=year(getdate())andmonth(m.SDate)=month(getdate()))mgroupbym.SCardNamehavingsum(m.ShopMark)>100)/**//*--最新的(我写的,上面是整合魅影的)select*fromShoppingMarkSMjoin(selectm.SCardName,sum(m.ShopMark)asMarkfromShoppingMarkmjoininsertedionm.SCardName=i.SCardNamegroupbym.SCardName)sonSM.SCardName=s.ScardNamewheremonth(SDate)=month(getdate())andyear(SDate)=year(getdate())ands.Mark>100*/beginupdatessets.SIncease=case--积分大于1000就是星级.所以不用判断是否是星级whenm.Mem_Type<>'一般VIP会员'thens.SMark*0.3elsecasewhens.SMark>4000thens.SMark*0.3--whens.SMark>4000then--200*0.2+200*0.23+200*0.25+200*0.28+(s.SMark-800)*0.3whens.SMark>3000then1000*0.2+1000*0.23+1000*0.25+(s.SMark-600)*0.28whens.SMark>2000then1000*0.2+100*0.23+(s.SMark-400)*0.25whens.SMark>1000then(s.SMark-200)*.023+1000*0.2elses.SMark*0.2endendfromSalaryIncreaseassjoininsertedions.SCardName=i.SCardNamejoinMemberInfomon(i.SCardName=m.Mem_Numands.SID=@i)or(i.SCardName=m.Mem_Numands.SIncease=0)end--go
[code]
-----------------------------------------------------------------------------------------------
SQLcode--bom结构,查找节点下所有子节点:createtableos(idint,parentidint,desnvarchar(10))insertintoosselect1,0,'体育用品'insertintoosselect2,0,'户外运动'insertintoosselect3,1,'篮球'insertintoosselect4,1,'足球'insertintoosselect5,2,'帐篷'insertintoosselect6,2,'登山鞋'insertintoosselect7,0,'男士用品'insertintoosselect8,7,'刮胡刀'insertintoosselect9,3,'大号篮球'--求个节点下所有子节点:createfunctionf_cid(@idint)returnsvarchar(500)asbegindeclare@ttable(idint,parentidint,desnvarchar(10),levint)declare@levintset@lev=1insertinto@tselect*,@levfromoswhereid=@idwhile(@@rowcount>0)beginset@lev=@lev+1insertinto@tselecta.*,@levfromosa,@tbwherea.parentid=b.idandb.lev=@lev-1enddeclare@cidsvarchar(500)select@cids=isnull(@cids+',','')+ltrim(id)from@torderbylevreturn@cidsendgo--调用函数select*,ids=dbo.f_cid(id)fromos--得到每个节点路径:createprocwsp2@idintasselect*,cast(''asvarchar(10))fullpathinto#osfromosDECLARE@iint,@jintset@i=0set@j=1select@i=max(parentid)from#osupdate#ossetfullpath=idwhile@j<=@ibeginupdate#ossetfullpath=a.fullpath+','+ltrim(#os.id)from#osinnerjoin#osaon#os.parentid=a.idwhere#os.parentid=@jset@j=@j+1endselect*from#osgo--调用存储过程execwsp21
-----------------------------------------------------------------------------------------------1.查看数据库的版本select@@version2.查看数据库所在机器操作系统参数execmaster..xp_msver3.查看数据库启动的参数sp_configure4.查看数据库启动时间selectconvert(varchar(30),login_time,120)frommaster..sysprocesseswherespid=1查看数据库服务器名和实例名print'ServerName...............:'+convert(varchar(30),@@SERVERNAME)print'Instance..................:'+convert(varchar(30),@@SERVICENAME)5.查看所有数据库名称及大小sp_helpdb重命名数据库用的SQLsp_renamedb'old_dbname','new_dbname'6.查看所有数据库用户登录信息sp_helplogins查看所有数据库用户所属的角色信息sp_helpsrvrolemember修复迁移服务器时孤立用户时,可以用的fix_orphan_user脚本或者LoneUser过程更改某个数据对象的用户属主sp_changeobjectowner[@objectname=]'object',[@newowner=]'owner'注意:更改对象名的任一部分都可能破坏脚本和存储过程。把一台服务器上的数据库用户登录信息备份出来可以用add_login_to_aserver脚本7.查看链接服务器sp_helplinkedsrvlogin查看远端数据库用户登录信息sp_helpremotelogin8.查看某数据库下某个数据对象的大小sp_spaceused@objname还可以用sp_toptables过程看最大的N(默认为50)个表查看某数据库下某个数据对象的索引信息sp_helpindex@objname还可以用SP_NChelpindex过程查看更详细的索引情况SP_NChelpindex@objnameclustered索引是把记录按物理顺序排列的,索引占的空间比较少。对键值DML操作十分频繁的表我建议用非clustered索引和约束,fillfactor参数都用默认值。查看某数据库下某个数据对象的的约束信息sp_helpconstraint@objname9.查看数据库里所有的存储过程和函数use@database_namesp_stored_procedures查看存储过程和函数的源代码sp_helptext'@procedure_name'查看包含某个字符串@str的数据对象名称selectdistinctobject_name(id)fromsyscommentswheretextlike'%@str%'创建加密的存储过程或函数在AS前面加WITHENCRYPTION参数解密加密过的存储过程和函数可以用sp_decrypt过程10.查看数据库里用户和进程的信息sp_who查看SQLServer数据库里的活动用户和进程的信息sp_who'active'查看SQLServer数据库里的锁的情况sp_lock进程号1--50是SQLServer系统内部用的,进程号大于50的才是用户的连接进程.spid是进程编号,dbid是数据库编号,objid是数据对象编号查看进程正在执行的SQL语句dbccinputbuffer()推荐大家用经过改进后的sp_who3过程可以直接看到进程运行的SQL语句sp_who3检查死锁用sp_who_lock过程sp_who_lock11.收缩数据库日志文件的方法收缩简单恢复模式数据库日志,收缩后@database_name_log的大小单位为Mbackuplog@database_namewithno_logdbccshrinkfile(@database_name_log,5)12.分析SQLServerSQL语句的方法:setstatisticstime{on|off}setstatisticsio{on|off}图形方式显示查询执行计划在查询分析器->查询->显示估计的评估计划(D)-Ctrl-L或者点击工具栏里的图形文本方式显示查询执行计划setshowplan_all{on|off}setshowplan_text{on|off}setstatisticsprofile{on|off}13.出现不一致错误时,NT事件查看器里出3624号错误,修复数据库的方法先注释掉应用程序里引用的出现不一致性错误的表,然后在备份或其它机器上先恢复然后做修复操作alterdatabase[@error_database_name]setsingle_user修复出现不一致错误的表dbccchecktable('@error_table_name',repair_allow_data_loss)或者可惜选择修复出现不一致错误的小型数据库名dbcccheckdb('@error_database_name',repair_allow_data_loss)alterdatabase[@error_database_name]setmulti_userCHECKDB有3个参数:repair_allow_data_loss包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象,这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。修复完成后,请备份数据库。repair_fast进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。这些修复可以很快完成,并且不会有丢失数据的危险。repair_rebuild执行由repair_fast完成的所有修复,包括需要较长时间的修复(如重建索引)。执行这些修复时不会有丢失数据的危险。以上脚本来源于:http://www.51windows.net/data/files/file_797.asp-----------------------------------------------------------------------------------------------SQLcode--库存先进先出简单例子:createtablet(idintidentity(1,1),namevarchar(50),--商品名称jint,--入库数量cint,--出库数量jdatedatetime--入库时间)insertintot(name,j,c,jdate)select'A',100,0,'2007-12-01'insertintot(name,j,c,jdate)select'A',200,0,'2008-01-07'insertintot(name,j,c,jdate)select'B',320,0,'2007-12-21'insertintot(name,j,c,jdate)select'A',100,0,'2008-01-15'insertintot(name,j,c,jdate)select'B',90,0,'2008-02-03'insertintot(name,j,c,jdate)select'A',460,0,'2008-02-01'insertintot(name,j,c,jdate)select'A',510,0,'2008-03-01'gocreateprocwsp@namevarchar(50),--商品名称@costint--销售量as--先得出该货物的库存是否够declare@sparefloat--剩余库存select@spare=sum(j)-sum(c)fromtwherename=@nameif(@spare>=@cost)begin--根据入库日期采用先进先出原则对货物的库存进行处理updatetsetc=casewhen(select@cost-isnull(sum(j),0)+isnull(sum(c),0)fromtwherename=@nameandjdate<=a.jdateandj!=c)>=0thena.jelsecasewhen(select@cost-isnull(sum(j),0)+isnull(sum(c),0)fromtwherename=@nameandjdate<a.jdateandj!=c)<0then0else(select@cost-isnull(sum(j),0)+isnull(sum(c),0)+a.cfromtwherename=@nameandjdate<a.jdateandj!=c)endendfromtawherename=@nameandj!=cendelseraiserror('库存不足',16,1)returngo--测试:execwsp@name='A',@cost=180select*fromt--droptablet--dropprocwsp
[/code]
-----------------------------------------------------------------------------------------------
SQLcode
--返程问题,找出雇员从本地出发后直接返回的情况createtabletrav(namenvarchar(10),datedatetime,comefromnvarchar(10),destinnvarchar(10),idint)insertintotravselect'张三','2007-01-01','上海','广州',1insertintotravselect'李四','2007-01-01','上海','广州',2insertintotravselect'李四','2007-02-01','上海','成都',3insertintotravselect'张三','2007-01-15','广州','上海',4insertintotravselect'张三','2007-02-06','上海','广州',5insertintotravselect'张三','2007-02-18','广州','上海',6goselecta.name,a.date,a.comefrom,a.destin,b.date,b.comefrom,b.destinfromtravainnerjointravbona.name=b.nameanda.comefrom=b.destinanda.destin=b.comefromwherea.id<b.idandnotexists(select1fromtravwherecomefrom=b.comefromanddate<b.dateanddate>a.date)godroptabletrav/*namedatecomefromdestindatecomefromdestin------------------------------------------------------------------------------------------------张三2007-01-0100:00:00.000上海广州2007-01-1500:00:00.000广州上海张三2007-02-0600:00:00.000上海广州2007-02-1800:00:00.000广州上海(2行受影响)*/
-----------------------------------------------------------------------------------------------
SQLcode--日期转换参数,值得收藏selectCONVERT(varchar,getdate(),120)2004-09-1211:06:08selectreplace(replace(replace(CONVERT(varchar,getdate(),120),'-',''),'',''),':','')20040912110608selectCONVERT(varchar(12),getdate(),111)2004/09/12selectCONVERT(varchar(12),getdate(),112)20040912selectCONVERT(varchar(12),getdate(),102)2004.09.12其它我不常用的日期格式转换方法:selectCONVERT(varchar(12),getdate(),101)09/12/2004selectCONVERT(varchar(12),getdate(),103)12/09/2004selectCONVERT(varchar(12),getdate(),104)12.09.2004selectCONVERT(varchar(12),getdate(),105)12-09-2004selectCONVERT(varchar(12),getdate(),106)12092004selectCONVERT(varchar(12),getdate(),107)0912,2004selectCONVERT(varchar(12),getdate(),108)11:06:08selectCONVERT(varchar(12),getdate(),109)091220041selectCONVERT(varchar(12),getdate(),110)09-12-2004selectCONVERT(varchar(12),getdate(),113)120920041selectCONVERT(varchar(12),getdate(),114)11:06:08.177
-----------------------------------------------------------------------------------------------
SQLcode[code]--我来一段--SQL2005CREATETABLE#t(idintIDENTITY(1,1)PRIMARYKEY,numsint)GOINSERTINTO#tSELECTabs(CHECKSUM(NEWID())%100000)GO10000----生成10000笔资料,可以是任意一数字SELECT*FROM#tGODROPTABLE#tGO
---------------------------------------------------------------------------------------------
固定列数的行列转换如studentsubjectgrade---------------------------student1语文80student1数学70student1英语60student2语文90student2数学80student2英语100……转换为语文数学英语student1807060student29080100……语句如下:selectstudent,sum(decode(subject,'语文',grade,null))"语文",sum(decode(subject,'数学',grade,null))"数学",sum(decode(subject,'英语',grade,null))"英语"fromtablegroupbystudent;
--------------------------------------------------------------------------------------------SELECT*FROMTABLENAME绝对经典,最常用的查询

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: