2011-08-06 24 views
2

我有一个像动态SQL和spexecutesql行为

c1 c2 c3 c4 
----------------- 
2 1 7 13 
9 2 8 14 
1 3 9 15 
5 4 10 16 
2 5 11 17 
11 6 12 18 

的桌子,一般我不知道列数(代码@d这里4)得到一个字符串形式:

2,9,1,5,2,11, 1,2,3,4,5,6, 7,8,9,10,11,12, 13,14,15,16,17,18 

要做到这一点我做:

DECLARE @d INT 
     ,@counterI INT 
     ,@template AS nvarchar(max) 

    SET @d = 4;  
    SET @counterI = 1; 
    Set @template = 'SELECT STUFF( 
         ( SELECT '','' + CAST([col] AS VARCHAR) FROM (';       
    WHILE (@counterI < @d) BEGIN 
     SET @template += ' SELECT [c'+CAST(@counterI-1 AS VARCHAR)+'] AS col FROM [MyTable] UNION ALL '; 
     SET @counterI = @counterI + 1; 
    END 
    Set @template += ' SELECT [c'+CAST(@counterI-1 AS VARCHAR)+'] AS col FROM [MyTable] ' 
    Set @template += ') alldata FOR XML PATH('''') ) , 1 , 1 , '''')';  

declare @CommaString varchar(max) 
set @CommaString = '' 
exec sp_executesql @template, N'@CommaString varchar(max) out', @CommaString out 

所以,如果我做

select @CommaString; 

enter image description here

为什么不@CommaString在选择它返回字符串的那一刻,如果这样做的sp_executesql的当它打印出来吗?

+0

你有没有检查@template有你期望的我T'你的示例表有第1-4个列,你的SQL看起来像在第0-3列上工作?另外,你在SQL中有两个不同的表名? – James

+0

对不起,我没有复制代码的权利,我已经更新了它,而且,是的,var @ template具有我期望的,事实上,我执行该查询并给了我字符串,spexecsql部分中的问题产生。 .. – cMinor

回答

3

我可能会遗漏一些关于sp_executesql如何工作的内容,但是你不需要像@template中的'SELECT @CommaString = ...'这样的东西,以便它将逗号字符串分配给out参数吗?

只是为了澄清,我想你需要的东西,如:

DECLARE @d INT 
     ,@counterI INT 
     ,@template AS nvarchar(max) 

SET @d = 4;  
SET @counterI = 1; 
Set @template = 'SELECT @CommaString = STUFF( 
        ( SELECT '','' + CAST([col] AS VARCHAR) FROM (';       
WHILE (@counterI < @d) BEGIN 
    SET @template += ' SELECT [c'+CAST(@counterI-1 AS VARCHAR)+'] AS col FROM [MyTable] UNION ALL '; 
    SET @counterI = @counterI + 1; 
END 
Set @template += ' SELECT [c'+CAST(@counterI-1 AS VARCHAR)+'] AS col FROM [MyTable] ' 
Set @template += ') alldata FOR XML PATH('''') ) , 1 , 1 , '''')';  

declare @CommaString varchar(max) 
set @CommaString = '' 
exec sp_executesql @template, N'@CommaString varchar(max) out', @CommaString = @CommaString out 

作为一个简单的例子,这样的事情也许是更容易阅读/明白我的意思:

declare @CommaString varchar(max) 
set @CommaString = '' 
exec sp_executesql 'SELECT @CommaString = ''1,2,3''', '@CommaString varchar(max) out', @CommaString = @CommaString out 

顺便说一句,我通常看到这种类型的字符串连接:

DECLARE @MyString varchar(max) 

SET @MyString = '' 

SELECT @MyString = @MyString + ',' + MyColumn 
    FROM MyTable 
+0

它假设在行'exec sp_executesql @template,N'@CommaString varchar(max)out',@CommaString out'部分'@CommaString out'完成你所说的,但仍然找不到错误... – cMinor

+0

您已经在exec语句中声明了out参数,但@template的内容似乎没有尝试设置它? – James

+0

那么,这就是在exec exec_executesql @template,N'@CommaString varchar(max)out',@CommaString out' aka @template – cMinor