ALTER procedure DBA.SumTable(@table varchar(50),@row varchar(50),@col varchar(50),@content varchar(50)) as declare @sql1 varchar(8000), @sql2 varchar(8000), @sql3 varchar(8000), @sql4 varchar(8000), @sql5 varchar(8000), @sql6 varchar(8000), @i real, @ic varchar(50), @mc varchar(50) execute('select ID=Identity(int,1,1),COL=''sum(case '+'devicename'+' when ''''''+'+'devicename'+'+'''''' then '+'value'+' else 0 end) as ''''''+'+'devicename'+'+'''''','' ,GID=0 into ##tmp from (select distinct '+'devicename'+'=replace('+'devicename'+','''''''','''''''''''') from '+'good'+')a') select @i = Max(len(COL)) from ##tmp --set @i=4000/@i update ##tmp set GID = ID/@i select @i = Max(GID),@mc = convert(varchar(50),@i) from ##tmp select @sql1 = '',@sql2 = '',@sql3 = '',@sql4 = '',@sql5 = '' while @i >= 0 select @ic = convert(varchar(50),@i),@i = @i-1,@sql1 = '@'+@ic+' as varchar(4000),'+@sql1,@sql2 = '@'+@ic+'='''','+@sql2,@sql3 = 'select @'+ @ic+'=@'+@ic+'+COL from ##tmp where gid='''+@ic+''''+"char"(13)+@sql3,@sql4 = '@'+@ic+'+'+@sql4 --set @sql5=''' from '+@table+' group by '+@row+'''' select @sql1 = 'declare '+"left"(@sql1,len(@sql1)-1)+"char"(13),@sql2 = 'select '+"left"(@sql2,len(@sql2)-1)+"char"(13),@sql4 = "left"(@sql4,len(@sql4)-1) execute(@sql1+@sql2+@sql3+'set @'+ @mc+'=left(@'+@mc+',len(@'+@mc+')-1)'+'execute(''select timetag,''+'+ @sql4+'+'+@sql5+')') drop table ##tmp
这个问题第1个回答:
..... 不会,帮顶一下
这个问题第2个回答:
Try: SQL code
ALTER procedure DBA.SumTable(@table varchar(50),@row varchar(50),@col varchar(50),@content varchar(50))
as
...
--> SQL code
ALTER procedure DBA.SumTable(@table varchar(50),@row varchar(50),@col varchar(50),@content varchar(50))
as
set nocount on
...
这个问题第3个回答:
两行注释处出问题了,不知道怎么解决,各位大侠帮忙一下。
这个问题第4个回答:
CREATE PROCEDURE SumTable @table varchar(50), --表名 @row varchar(50), --行字段 @col varchar(50), --列字段 @content varchar(50) -----WITH ENCRYPTION AS declare @sql1 varchar(8000), @sql2 varchar(8000), @sql3 varchar(8000), @sql4 varchar(8000), @sql5 varchar(8000), @sql6 varchar(8000), @i int, @ic varchar(50), @mc varchar(50) exec('select ID=Identity(int,1,1),COL=''sum(case '+@col+' when ''''''+'+@col+'+'''''' then '+@content+' else 0 end) as ''''''+'+@col+'+'''''','' ,GID=0 into ##tmp from (select distinct '+@col+'=replace('+@col+','''''''','''''''''''') from '+@table+')a') select @i=Max(len(COL)) from ##tmp set @i=4000/@i update ##tmp set GID=ID/@i select @i=Max(GID),@mc=cast(@i as varchar(50)) from ##tmp select @sql1='',@sql2='',@sql3='',@sql4='',@sql5='' while @i>=0 select @ic=cast(@i as varchar(50)),@i=@i-1,@sql1='@'+@ic+' as varchar(4000),'+@sql1,@sql2='@'+@ic+'='''','+@sql2, @sql3='select @'+@ic+'=@'+@ic+'+COL from ##tmp where gid='''+@ic+''''+char(13)+@sql3,@sql4='@'+@ic+'+'+@sql4 set @sql5=''' from '+@table+' group by '+@row+'''' select @sql1='declare '+left(@sql1,len(@sql1)-1)+char(13),@sql2='select '+left(@sql2,len(@sql2)-1)+char(13),@sql4=left(@sql4,len(@sql4)-1) exec(@sql1+@sql2+@sql3+ 'set @'+@mc+'=left(@'+@mc+',len(@'+@mc+')-1)'+ 'exec(''select '+@row+',''+'+@sql4+'+'+@sql5+')' ) drop table ##tmp GO 在SQL Server下是这样的,都能通过,在Sybase下就不能通过了,错误显示131,不知道如何解决了
这个问题第5个回答:
有Sybase 区吗? 发到那里问问
这个问题第6个回答:
sybase不支持set语句吧,改成select select @i=4000/@i select @sql5=''' from '+@table+' group by '+@row+''''
这个问题第7个回答:
估计问题还有很多 cast也不支持 动态语句里的set也要修改
这个问题第8个回答:
您好,cast不支持,cast应该换成什么啊? 我把exec改成execute了,set改成select了,还有剩下的怎么改了,这下算是通过了,可问题还有,就是不能执行结果,郁闷
|
|
|