Domanda

I am trying to return a comma separated list of strings from a stored procedure like this:

@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

but I get:

Must declare the scalar variable "@Strings"

Any ideas?

È stato utile?

Soluzione

Dynamic Sql has its own scope, any variables declared outside of its scope are not visible to dynamic sql, You declare any passing variable in second parameter to sp_executesql and if you are expecting to store and retrieve a value from that variable pass it as an OUTPUT variable using the key work OUT or OUTPUT.

Also use QUOTENAME() function around your Sql Server Object names when concatenating them into strings. Protects you against sql injection attack.

See below....

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

Altri suggerimenti

First, use FOR XML PATH method for concatenating string,

Second, you need an OUTPUT parameter to make this work:

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

This is using AdventureWorks2012 sample database, modify to your schema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top