带有COALESCE的动态sql中的变量表名

时间:2014-01-30 00:48:50

标签: sql-server stored-procedures prepared-statement dynamic-sql

我希望以这种形式col1,col2,col3

获取变量中表格的列

所以我使用了以下查询

SELECT @cols = COALESCE(@cols + ', ', '') + column_name FROM
INFORMATION_SCHEMA.COLUMNS where TABLE_CATALOG='mudb' and TABLE_NAME='mytbl'

我在上面取得了成功。但是当我想使用变量表名时。我遇到了问题。我试过了

SELECT @cols = COALESCE(@cols + ', ', '') + column_name FROM
INFORMATION_SCHEMA.COLUMNS where TABLE_CATALOG='mudb' and TABLE_NAME=@tbl

但它给出了null结果。然后我提示使用EXECUTE sp_executesql

set @FullStatement='SELECT @cols = COALESCE(@cols + '', '', '''') +
column_name FROM INFORMATION_SCHEMA.COLUMNS where TABLE_CATALOG=''mudb''
and TABLE_NAME=@tbl'

PRINT @FullStatement
EXECUTE sp_executesql @FullStatement

然后它给了我错误Must declare the scalar variable "@cols"但声明了@cols

1 个答案:

答案 0 :(得分:1)

@cols可以在您运行的脚本范围内声明。它未在动态SQL的范围内声明。变量不会从一个级别继承到另一个级别。

因此,您希望将其传递到执行环境中,您可以使用sp_executesql执行此操作:

set @FullStatement='SELECT @cols = COALESCE(@cols + '', '', '''') +
column_name FROM INFORMATION_SCHEMA.COLUMNS where TABLE_CATALOG=''mudb''
and TABLE_NAME=@tbl'

PRINT @FullStatement
EXECUTE sp_executesql @FullStatement, N'@Cols varchar(8000) output, @Tbl varchar(8000)',
                      @cols = @cols, @tbl = 'MyTable';

这就是你如何使execute语句工作。但是,连接列的方法在动态SQL中不起作用。