求一存储过程写法,上了好多论坛都没有结果,郁闷阿,各位高人请来这里赐教 挖靠!这个String要够长啊!动作怎么产生的?关键就是拆分字段了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这种事情最好不要放在数据库里处理,自己在脚本里面生成好了SQL语句再来执行比较好吧。有段时间没写SQL脚本了,正好借这个机会练练手,下面是我写的,运行OKcreate table A(FormNo char(3), SerialNo char(3), ActionName varchar(20))create table B(FormNo char(3), SerialNo char(3), ActionName varchar(20))goinsert into A values('001', 'aaa', 'action1')insert into A values('001', 'bbb', 'action1')insert into A values('003', 'ddd', 'action3')insert into A values('004', 'eee', 'action4')insert into B values('001', 'ccc', 'action1')insert into B values('002', 'ccc', 'action2')godeclare @arg varchar(8000)set @arg = '001,aaa,A;001,bbb,A;002,ccc,B;003,ddd,A;004,eee,A'declare @i int, @j intdeclare @s varchar(100), @argTmp varchar(8000)declare @sql varchar(8000)declare @SrotNo int, @FormNo char(3), @SerialNo char(3), @Table varchar(20)SET NOCOUNT ONset @sql = ''set @SrotNo = 0set @argTmp = @argwhile 1=1begin set @SrotNo = @SrotNo + 1 set @i = CHARINDEX(';', @argTmp) if @i > 0 begin set @s = LEFT(@argTmp, @i - 1) -- 得到一条记录:001,aaa,A set @argTmp = SUBSTRING(@argTmp, @i + 1, 8000) end else set @s = @argTmp -- 生成SQL语句 if @sql <> '' set @sql = @sql + ' union ' set @sql = @sql + 'select ' + CAST(@SrotNo as varchar) + ' as SortNo, FormNo, SerialNo, ActionName from ' -- 1. FormNo set @j = CHARINDEX(',', @s) set @FormNo = LTRIM(RTRIM(LEFT(@s, @j - 1))) set @s = SUBSTRING(@s, @j + 1, 100) -- 2. SerialNo set @j = CHARINDEX(',', @s) set @SerialNo = LTRIM(RTRIM(LEFT(@s, @j - 1))) -- 3. Table Name set @Table = LTRIM(RTRIM(SUBSTRING(@s, @j + 1, 100))) --- 4. sql set @sql = @sql + @Table + ' where FormNo = ''' + @FormNo + ''' and SerialNo = ''' + @SerialNo + '''' if @i <= 0 breakendprint @sqlexec(@sql)SET NOCOUNT OFFdrop table Adrop table B action1 aciton2就是表中aciton 对应的字段阿,不知道怎么说清楚了,就是传入一个字符串数组(因为sql中好像不可以传入数组,所以我用字符串代替了,为了描述清楚,我用数组表示吧)设string[]=({001,aaa,A};{001,bbb,A};{002,ccc,B};{003,ddd,A};{004,eee,A};{001,aaa,A })每个{}中表示表{号码,产品序列号码,表名}然后就是要实现我说的功能了,各位达仁还不明白我的意思吗,急死人了 测试了 RedCoin(差哪呢) 写的,还是不怎么对,编号出了点问题, 那位再帮忙耐心看看哪里出了问题 android Contacts表 主键_ID 为什么是自增长的 存储过程 传进参数和传出参数问题 问个sql入门语句的写法 记录与记录之间的日期比较如何实现呢? xp_cmdshell导出问题 关于SQL中float类型 还是关于合并查询结果的,请大家帮个忙啊! 定时输出数据到文本文件中,如何设定每次的文件名(由时间形成)? sql server2000如何把数据转换为xml数据? 怎样找出列ID是是自动递增的表? group by和count问题 关于用交叉表得到后的数据排序的问题,谢谢!
有段时间没写SQL脚本了,正好借这个机会练练手,下面是我写的,运行OK
create table A(FormNo char(3), SerialNo char(3), ActionName varchar(20))
create table B(FormNo char(3), SerialNo char(3), ActionName varchar(20))
go
insert into A values('001', 'aaa', 'action1')
insert into A values('001', 'bbb', 'action1')
insert into A values('003', 'ddd', 'action3')
insert into A values('004', 'eee', 'action4')
insert into B values('001', 'ccc', 'action1')
insert into B values('002', 'ccc', 'action2')
godeclare @arg varchar(8000)
set @arg = '001,aaa,A;001,bbb,A;002,ccc,B;003,ddd,A;004,eee,A'declare @i int, @j int
declare @s varchar(100), @argTmp varchar(8000)
declare @sql varchar(8000)
declare @SrotNo int, @FormNo char(3), @SerialNo char(3), @Table varchar(20)SET NOCOUNT ONset @sql = ''
set @SrotNo = 0
set @argTmp = @arg
while 1=1
begin
set @SrotNo = @SrotNo + 1
set @i = CHARINDEX(';', @argTmp)
if @i > 0
begin
set @s = LEFT(@argTmp, @i - 1) -- 得到一条记录:001,aaa,A
set @argTmp = SUBSTRING(@argTmp, @i + 1, 8000)
end
else
set @s = @argTmp -- 生成SQL语句
if @sql <> '' set @sql = @sql + ' union '
set @sql = @sql + 'select ' + CAST(@SrotNo as varchar) + ' as SortNo, FormNo, SerialNo, ActionName from '
-- 1. FormNo
set @j = CHARINDEX(',', @s)
set @FormNo = LTRIM(RTRIM(LEFT(@s, @j - 1)))
set @s = SUBSTRING(@s, @j + 1, 100)
-- 2. SerialNo
set @j = CHARINDEX(',', @s)
set @SerialNo = LTRIM(RTRIM(LEFT(@s, @j - 1)))
-- 3. Table Name
set @Table = LTRIM(RTRIM(SUBSTRING(@s, @j + 1, 100)))
--- 4. sql
set @sql = @sql + @Table + ' where FormNo = ''' + @FormNo + ''' and SerialNo = ''' + @SerialNo + '''' if @i <= 0 break
end
print @sql
exec(@sql)SET NOCOUNT OFFdrop table A
drop table B
({001,aaa,A};{001,bbb,A};{002,ccc,B};{003,ddd,A};{004,eee,A};{001,aaa,A })每个{}中表示表{号码,产品序列号码,表名}然后就是要实现我说的功能了,各位达仁还不明白我的意思吗,急死人了