【问题标题】:SQL - check if column exists within stored procedure (table is variable)SQL - 检查存储过程中是否存在列(表是变量)
【发布时间】:2018-04-27 01:21:47
【问题描述】:

这似乎没有在任何地方得到回答(尽管已经回答了非常相似的案例)......

我遇到了一个问题,我试图在存储过程中更新表中的列值。但是,我将多个表传递给此存储过程,并且某些表具有特定列,而其他表则没有。因此,我需要在运行此更新之前检查该列是否存在。现在,因为它在存储过程中,SQL 似乎在解析整个代码块并抱怨该列不存在。

代码:

IF COL_LENGTH(''DBName' + @date+ '..' + @TableName + @date+''', ''ColumnName' + @specifictocolumn + 'restofcolumnname'') IS NOT NULL
    update  DBName' + @date+ '..' + @TableName + @date+ ' set ColumnName' + @specifictocolumn + 'restofcolumnname = 0

或者

IF EXISTS(SELECT 1 FROM sys.columns WHERE Name = N''ColumnName' + @specifictocolumn + 'restofcolumnname '' AND Object_ID = Object_ID(N''DBName' + @date+ '..' + @TableName + @date+'''))
    update  DBName' + @date+ '..' + @TableName + @date+ ' set ColumnName' + @specifictocolumn + 'restofcolumnname = 0

这两个都给出了错误(出于 IP 目的删除了列名):

消息 207,第 16 级,状态 1,第 6 行 列名“ColumnName”无效。

我查看了一个名为“禁用 TSQL 脚本检查”的堆栈溢出问题,但他们建议您在动态 sql 之外调用列的检查,然后仅在通过检查时执行。这对我不起作用,因为部分 if 语句中包含需要在动态 sql 中的变量。

【问题讨论】:

    标签: mysql sql sql-server stored-procedures


    【解决方案1】:

    您仍然可以将动态 SQL 拆分为两部分:

    1. 检查列是否存在
    2. 在 1. 返回 true 时进行实际更新

    您可能希望为此使用sp_executesqlOUTPUT 参数。

    类似这样的事情:

    DECLARE @sql nvarchar(max),
            @result int
    
    SELECT @sql = 'SELECT @col_length = COL_LENGTH(''DBName' + @date + '..' + @TableName + @date + ''', ''ColumnName' + @specifictocolumn + 'restofcolumnname'')'
    
    EXEC sp_executesql @stmt = @sql,
                       @params = N'@col_length int OUTPUT',
                       @col_length = @result OUTPUT
    
    IF @result IS NOT NULL
        BEGIN
            EXEC ('update  DBName' + @date+ '..' + @TableName + @date+ ' set ColumnName' + @specifictocolumn + 'restofcolumnname = 0') 
        END
    

    或者你可以“在动态中动态”,但很快就会变得一团糟。

    【讨论】:

    • 啊,你太棒了!非常感谢,这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2021-08-25
    • 2011-08-08
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多