SQL - 检查存储过程中是否存在列(表是变量)

时间:2017-11-14 07:26:14

标签: mysql sql sql-server stored-procedures

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

我有一个问题,我正在尝试更新存储过程中的表中的列的值。但是,我将多个表传递给此存储过程,并且某些表具有某个列而其他表没有。因此,我需要在运行此更新之前检查列是否存在。现在,因为它存储在一个存储过程中,所以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目的删除了列名):

  

Msg 207,Level 16,State 1,Line 6   列名称'ColumnName'无效。

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

1 个答案:

答案 0 :(得分:0)

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

  1. 检查列是否存在
  2. 在1.返回true时进行实际更新
  3. 您可能希望sp_executesql使用OUTPUT参数。

    有些事情如下:

    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
    

    或者你可以在动态内部动态,但会很快变得一团糟。