【问题标题】:Variable table name in dynamic sql with COALESCE带有 COALESCE 的动态 sql 中的变量表名
【发布时间】:2014-01-30 00:48:49
【问题描述】:

我想以这种形式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

但它给出了空结果。然后我决定使用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 被声明

【问题讨论】:

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


    【解决方案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';
    

    这就是让执行语句工作的方式。但是,这种连接列的方法在动态 SQL 中不起作用。

    【讨论】:

    • 现在说 \@tbl not delared, \@cols not delared。实际上我只是想获得与我的第一个代码相同的带有变量表名的输出
    • 感谢 tbl 错误。我刚刚设置了 @tbl='mytbl' (虽然存储过程已经收到了它的价值,但它没有工作)现在我用我的第二个代码得到了我的结果(动态表名)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 2012-12-11
    • 1970-01-01
    • 2019-02-15
    • 2015-01-18
    • 1970-01-01
    • 2019-07-25
    相关资源
    最近更新 更多