--测试数据
create table 表(
时间 int, 企业名称 varchar(10),
流动比率 decimal(10,1),速动比率 decimal(10,1),现金比率 decimal(10,1),
现金流动负债比率 decimal(10,1), 现金负债比率 decimal(10,1))
insert 表 select 2003,'清华同方',3.39, 1.35, 0.15, 10.6, 5.6
union all select 2003,'北大方正',3.0, 1.6, 0.21, 15.3, 6.5
union all select 2004,'清华同方',4.20, 1.50, 0.13, 12.3, 6.3
union all select 2004,'北大方正',3.5, 1.68, 0.16, 14.3, 6.0
go--查询处理
declare @s1 varchar(8000),@s2 varchar(8000)
,@s3 varchar(8000),@s4 varchar(8000),@s5 varchar(8000)
,@i varchar(10)
select @s1='',@s2='',@s3='',@s4='',@s5='',@i='0'
select @s1=@s1+',@'+@i+' varchar(8000)'
,@s2=@s2+',@'+@i+'=''[字段1]='''''+name+''''''''
,@s3=@s3+'
,@'+@i+'=@'+@i+'+'',[字段''+cast(@i as varchar)+'']=''+quotename(['+name+'],'''''''')'
,@s4=@s4+',@'+@i+'=''select ''+@'+@i
,@s5=@s5+'+'' union all ''+@'+@i
,@i=cast(@i as int)+1
from syscolumns
where object_id('表')=idselect @s1=stuff(@s1,1,1,'')
,@s2=stuff(@s2,1,1,'')
,@s4=stuff(@s4,1,1,'')
,@s5=stuff(@s5,1,15,'')exec('declare '+@s1+',@i int
select '+@s2+'
set @i=1
select @i=@i+1'+@s3+'
from 表
select '+@s4+'
exec('+@s5+')')
go
--删除测试
drop table 表/*--测试结果字段1 字段2 字段3 字段4 字段5
---------------- -------- -------- -------- --------
时间 2003 2003 2004 2004
企业名称 清华同方 北大方正 清华同方 北大方正
流动比率 3.4 3.0 4.2 3.5
速动比率 1.4 1.6 1.5 1.7
现金比率 0.2 0.2 0.1 0.2
现金流动负债比率 10.6 15.3 12.3 14.3
现金负债比率 5.6 6.5 6.3 6.0(7 行受影响)
--*/
create table 表(
时间 int, 企业名称 varchar(10),
流动比率 decimal(10,1),速动比率 decimal(10,1),现金比率 decimal(10,1),
现金流动负债比率 decimal(10,1), 现金负债比率 decimal(10,1))
insert 表 select 2003,'清华同方',3.39, 1.35, 0.15, 10.6, 5.6
union all select 2003,'北大方正',3.0, 1.6, 0.21, 15.3, 6.5
union all select 2004,'清华同方',4.20, 1.50, 0.13, 12.3, 6.3
union all select 2004,'北大方正',3.5, 1.68, 0.16, 14.3, 6.0
go--查询处理
declare @s1 varchar(8000),@s2 varchar(8000)
,@s3 varchar(8000),@s4 varchar(8000),@s5 varchar(8000)
,@i varchar(10)
select @s1='',@s2='',@s3='',@s4='',@s5='',@i='0'
select @s1=@s1+',@'+@i+' varchar(8000)'
,@s2=@s2+',@'+@i+'=''[字段1]='''''+name+''''''''
,@s3=@s3+'
,@'+@i+'=@'+@i+'+'',[字段''+cast(@i as varchar)+'']=''+quotename(['+name+'],'''''''')'
,@s4=@s4+',@'+@i+'=''select ''+@'+@i
,@s5=@s5+'+'' union all ''+@'+@i
,@i=cast(@i as int)+1
from syscolumns
where object_id('表')=idselect @s1=stuff(@s1,1,1,'')
,@s2=stuff(@s2,1,1,'')
,@s4=stuff(@s4,1,1,'')
,@s5=stuff(@s5,1,15,'')exec('declare '+@s1+',@i int
select '+@s2+'
set @i=1
select @i=@i+1'+@s3+'
from 表
select '+@s4+'
exec('+@s5+')')
go
--删除测试
drop table 表/*--测试结果字段1 字段2 字段3 字段4 字段5
---------------- -------- -------- -------- --------
时间 2003 2003 2004 2004
企业名称 清华同方 北大方正 清华同方 北大方正
流动比率 3.4 3.0 4.2 3.5
速动比率 1.4 1.6 1.5 1.7
现金比率 0.2 0.2 0.1 0.2
现金流动负债比率 10.6 15.3 12.3 14.3
现金负债比率 5.6 6.5 6.3 6.0(7 行受影响)
--*/
偶一般直接union 或者join 慢慢一條一條寫~~~
create table 表(
时间 int, 企业名称 varchar(10),
流动比率 decimal(10,1),速动比率 decimal(10,1),现金比率 decimal(10,1),
现金流动负债比率 decimal(10,1), 现金负债比率 decimal(10,1))
insert 表 select 2003,'清华同方',3.39, 1.35, 0.15, 10.6, 5.6
union all select 2003,'北大方正',3.0, 1.6, 0.21, 15.3, 6.5
union all select 2004,'清华同方',4.20, 1.50, 0.13, 12.3, 6.3
union all select 2004,'北大方正',3.5, 1.68, 0.16, 14.3, 6.0
go--查询处理
declare @s1 varchar(8000),
@s2 varchar(8000),
@s3 varchar(8000),
@s4 varchar(8000),
@s5 varchar(8000),
@i varchar(10)
select @s1='',@s2='',@s3='',@s4='',@s5='',@i='0'
select @s1=@s1+',@'+@i+' varchar(8000)',
@s2=@s2+',@'+@i+'=''时间='''''+name+'''''''',
@s3=@s3+',@'+@i+'=@'+@i+'+'',[''+cast([时间] as varchar)+'']=''''''+cast(['+name+'] as varchar)+''''''''',
@s4=@s4+',@'+@i+'=''select ''+@'+@i,
@s5=@s5+'+'' union all ''+@'+@i,
@i=cast(@i as int)+1
from syscolumns
where object_id('tt')=id and colid>1
order by colid select @s1=stuff(@s1,1,1,'')
,@s2=stuff(@s2,1,1,'')
,@s3=stuff(@s3,1,4,'')
,@s4=stuff(@s4,1,1,'')
,@s5=stuff(@s5,1,15,'')
exec('declare '+@s1+'
select '+@s2+'
select '+@s3+'
from tt
select '+@s4+'
exec('+@s5+')') 我这么写开始也是可以的,不知道改动了什么,开始报错:
服务器: 消息 141,级别 15,状态 1,行 5
向变量赋值的 SELECT 语句不能与数据检索操作结合使用。
郁闷了半天,也没找出错误:(
我的代码是:
select @s1=stuff(@s1,1,1,'')
,@s2=stuff(@s2,1,1,'')
,@s3=stuff(@s3,1,4,'')
,@s4=stuff(@s4,1,1,'')
,@s5=stuff(@s5,1,15,'')
zjcxc(邹建) 的代码是:select @s1=stuff(@s1,1,1,'')
,@s2=stuff(@s2,1,1,'')
,@s4=stuff(@s4,1,1,'')
,@s5=stuff(@s5,1,15,'')
不同之处在于,我的多了一行
,@s3=stuff(@s3,1,4,'')
是这个问题吗?stuff()函数的作用是去除第一个逗号吗?
,@s2=stuff(@s2,1,1,'')
,@s3=stuff(@s3,1,4,'')
,@s4=stuff(@s4,1,1,'')
,@s5=stuff(@s5,1,15,'') 改為
select @s1=stuff(@s1,1,1,'')
,@s2=stuff(@s2,1,1,'')
,@s3=stuff(@s3,1,1,'')
,@s4=stuff(@s4,1,1,'')
,@s5=stuff(@s5,1,15,'')