2014-04-04 47 views
0

我試圖返回一個逗號分隔的字符串列表,從這樣一個存儲過程:從存儲過程返回一個逗號分隔的字符串列表

@Strings NVARCHAR(MAX) OUT 

... 

DECLARE @Sql NVARCHAR(MAX); 

SET @Sql = 'SELECT @Strings = COALESCE(@Strings + '', '','''') + CAST(Name AS NVARCHAR(MAX)) FROM ' + @BlaTableName + ' order by Name' 

EXEC sp_executesql @Sql 

,但我得到:

必由之路聲明標量變量「@Strings」

任何想法?

+2

'@ Strings'超出範圍的範圍內'sp_executesql' – DMason

+0

FWIW,你會通過返回一組和創建取得更好的成績逗號分隔列表中的客戶端應用程序 –

回答

2

動態Sql有它自己的作用域,任何在其作用域之外聲明的變量對動態sql都是不可見的,您將第二個參數中的任何傳遞變量聲明爲sp_executesql,並且如果您期望從該變量存儲並獲取值它作爲一個OUTPUT變量使用關鍵工作OUTOUTPUT

同時使用QUOTENAME()函數將您的Sql Server對象名連接成字符串時。防止SQL注入攻擊。

見下....

DECLARE @Strings NVARCHAR(MAX); 
DECLARE @Sql NVARCHAR(MAX); 
DECLARE @BlaTableName NVARCHAR(128) = N'Table_Name' 

SET @Sql = N'SELECT @Strings = COALESCE(@Strings + '','', '''','''') + CAST(Name AS NVARCHAR(MAX)) 
      FROM ' + QUOTENAME(@BlaTableName) + N' order by Name' 

EXEC sp_executesql @Sql 
        ,N'@Strings NVARCHAR(MAX) OUT' --<-- you need to declare variable here 
        ,@Strings OUTPUT 

SELECT @Strings --<-- Test it 
1

首先,使用FOR XML PATH方法串聯串,

其次,你需要的OUTPUT參數,使這項工作:

declare @strings nvarchar(max) 
declare @BlaTableName sysname = 'customer'; 

declare @Sql nvarchar(max); 

set @sql = ' 
select @strings=substring(col_list, 1, len(col_list)-1) 
from (
    select column_name + '', '' as [text()] 
    from information_schema.columns 
    where table_name = ''' + @BlaTableName + ''' 
    order by ordinal_position 
    for xml path('''')) x(col_list) 
' 

exec sp_executesql 
@sql, 
N'@strings nvarchar(max) out', 
@strings out 

select @strings 

這是使用AdventureWorks2012示例數據庫,修改你的架構。

相關問題