`
xiaoer_1982
  • 浏览: 1811886 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

SQL用户数据自动生成测试用例(第二版)

阅读更多


Version:V1.002

Date:2008-05-16

修改描述:

1、 处理空格带来的异常
2、 增加了形如yyyy-mm-dd hh:mm:ss
yyyy-m-d h:m:s 格式的处理


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</spa
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics