我希望以这种形式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
答案 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中不起作用。