这似乎没有在任何地方得到解答(尽管已经回答了非常相似的案例)......
我有一个问题,我正在尝试更新存储过程中的表中的列的值。但是,我将多个表传递给此存储过程,并且某些表具有某个列而其他表没有。因此,我需要在运行此更新之前检查列是否存在。现在,因为它存储在一个存储过程中,所以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中的变量。
答案 0 :(得分:0)
您仍然可以将动态SQL拆分为两部分:
您可能希望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
或者你可以在动态内部动态,但会很快变得一团糟。