2011-08-06 22 views
2

私は形式の文字列を取得するために(コードでここ4を@d)列の数を知っているだろう一般的のように私は動的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 

のようなテーブルを持っている:

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

なぜsp_executesqlのをやったときに、それが右に印刷されている場合、文字列を返すことを選択した瞬間に@CommaStringではないでしょうか?

+0

私はあなたが私が期待しているものをチェックしましたか? t?あなたのサンプルテーブルには1から4までのカラムがあり、SQLは0〜3のカラムで動作するように見えますか?また、SQLには2つの異なるテーブル名がありますか? – 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 sp_executesql @template、N '@ CommaString varchar(max)out'、@CommaString out' aka @template – cMinor

関連する問題