setnocounton go --处理当前串中的空格,对时分秒的处理 createfunctionf_castdt(@svarchar(8000)) returnsvarchar(1000) as begin set@s=ltrim(@s) WHILECHARINDEX('',@s)>0 BEGIN SET@s=replace(@s,'','') END set@s=casewhenpatindex('%-[0-9][0-9][0-9][0-9]:%',@s)>0thenstuff(@s,patindex('%-[0-9][0-9][0-9][0-9]:%',@s)+3,1,'*') whenpatindex('%-[0-9][0-9][0-9]:%',@s)>0thenstuff(@s,patindex('%-[0-9][0-9][0-9]:%',@s)+3,1,'*') whenpatindex('%-[0-9][0-9][0-9]:%',@s)>0thenstuff(@s,patindex('%-[0-9][0-9][0-9]:%',@s)+2,1,'*') whenpatindex('%-[0-9][0-9]:%',@s)>0thenstuff(@s,patindex('%-[0-9][0-9]:%',@s)+2,1,'*')else@send return@s end go --加一个分隔函数: createfunctionF_split( @svarchar(8000),--包含多个数据项的字符串 @posint,--要获取的数据项的位置 @splitvarchar(10)--数据分隔符 )RETURNSvarchar(100) AS BEGIN IF@sISNULLRETURN(NULL) DECLARE@splitlenint--分隔符长度 SELECT@splitlen=LEN(@split+'a')-2 WHILE@pos>1ANDcharindex(@split,@s+@split)>0 SELECT@pos=@pos-1, @s=stuff(@s,1,charindex(@split,@s+@split)+@splitlen,'') RETURNreplace((nullif(left(@s,charindex(@split,@s+@split)-1),'')),char(13),'') END GO --判断当前串是有字母如果有那么当作varchar createfunctionf_ischar(@svarchar(100)) returnsbit as begin ifpatindex('%[a-zA-Z]%',@s)>0 return1 return0 end go --循环截取法 CREATEFUNCTIONf_splitSTR( @svarchar(8000),--待分拆的字符串 @splitvarchar(20)--数据分隔符 )RETURNS@reTABLE(colvarchar(100)) AS BEGIN DECLARE@splitlenint set@s=ltrim(rtrim(@s)) SET@splitlen=LEN(@split+'a')-2 WHILECHARINDEX(@split,@s)>0 BEGIN INSERT@reVALUES(rtrim(ltrim(LEFT(@s,CHARINDEX(@split,@s)-1)))) SET@s=ltrim(STUFF(@s,1,CHARINDEX(@split,@s)+@splitlen,'')) END INSERT@reVALUES(@s) RETURN END GO createprocsp_autoscript @svarchar(8000) as declare@avarchar(8000),@bvarchar(8000),@cvarchar(8000) set@a=rtrim(left(@s,charindex(char(13),@s)-1)) set@s=right(@s,len(@s)-charindex(char(13),@s)-1) set@b=rtrim(left(@s,charindex(char(13),@s)-1)) set@s=right(@s,len(@s)-charindex(char(13),@s)-1) set@c=rtrim(left(@s,charindex(char(13),@s)-1)) set@s=left(@s,len(@s)-1) createtable#tmp1(pxintidentity(1,1),colvarchar(120),col2varchar(50),col3varchar(50)) createtable#tmp2(pxintidentity(1,1),colvarchar(120)) createtable#tmp3(pxintidentity(1,1),colvarchar(1000)) insertinto#tmp1(col)selectltrim(rtrim(col))fromf_splitSTR(@b,'') set@c=dbo.f_castdt(@c) insertinto#tmp2selectltrim(rtrim(col))fromf_splitSTR(@c,'') insertinto#tmp3selectltrim(rtrim(col))fromf_splitSTR(@s,' ') --取每一列的最大值,尽量让类型准确 --updatea --setcol=c.col --from#tmp2aleftjoin( --selecta.px,max(dbo.F_split(b.col,a.px,''))ascol --from#tmp2a,#tmp3b --groupbya.px)cona.px=c.px declare@pxint,@colvarchar(100),@maxidint select@maxid=count(1)from#tmp1 DECLAREfCURSORFORSELECTpx,colFROM#tmp2 OPENf FETCHNEXTFROMfINTO@px,@col WHILE@@FETCH_STATUS=0 BEGIN set@col=--还原datatime数据用于判断 casewhenpatindex('%-[0-9][0-9]*[0-9][0-9]:%',@col)>0thenstuff(@col,patindex('%-[0-9][0-9]*[0-9][0-9]:%',@col)+3,1,'') whenpatindex('%-[0-9][0-9]*[0-9]:%',@col)>0thenstuff(@col,patindex('%-[0-9][0-9]*[0-9]:%',@col)+3,1,'') whenpatindex('%-[0-9]*[0-9][0-9]:%',@col)>0thenstuff(@col,patindex('%-[0-9]*[0-9][0-9]:%',@col)+2,1,'') whenpatindex('%-[0-9]*[0-9]:%',@col)>0thenstuff(@col,patindex('%-[0-9]*[0-9]:%',@col)+2,1,'')else@colend ifISDATE(@col)=1 iflen(@col)<=10 update#tmp1 setcol=col+'smalldatetime,', col2=casewhenpx=1then'select'''''else''''''end, col3=casewhenpx=@maxidthen'''''unionall'else''''','end wherepx=@px else update#tmp1 setcol=col+'datetime,', col2=case