检查临时表中是否存在列在SQL Server中始终返回false

|| 我有以下执行语句,该语句创建一个表(使用来自另一个过程的数据),将这些值插入一个临时表中,添加一个图像列(因为它们不能包含在分组中),然后根据另一个条件根据其更新临时表(结果表字段在SSRS报表中使用,因此我需要保留IMAGE数据类型):
EXEC (\'SELECT \' + @COL_TO_GROUP_BY + @COL_ADDITONAL + @sColVals + \' INTO
#RESULTS_TABLE from (\' + @SQL_STATEMENT + \') A \' + @WHERE_CLAUSE + \' GROUP BY \' +
@COL_TO_GROUP_BY +

\' ALTER TABLE #RESULTS_TABLE
ADD IMAGE_DATA IMAGE

IF EXISTS(SELECT * FROM tempdb.INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 
\'\'COLUMN_A\'\' and TABLE_NAME LIKE \'\'#RESULTS_TABLE%\'\')
BEGIN
    UPDATE #RESULTS_TABLE
    SET IMAGE_DATA = FILE_DATA
    FROM #RESULTS_TABLE A, #IMAGE_TABLE B 
    WHERE A.COLUMN_A = B.COLUMN_A
END

SELECT * FROM #RESULTS_TABLE\')
问题在于,无论是否存在COLUMN_A,IMAGE_DATA的列始终为NULL。还有其他方法可以将数据获取到IMAGE_DATA列中吗?请帮忙! 注意:我将不接受任何可得出结论,认为该问题与其他表中的内容有关,尤其是WHERE子句中的内容。我已经进行了多次验证,以确保条件可以为真和为假(匹配的行,没有匹配的行等)。因此,这排除了条件语句。谢谢。 编辑: 我仍然不确定是什么确切原因,但是我最终创建了一个全局临时表并运行了两个单独的过程,现在看来一切正常。我必须接受最接近我自己的解决方案的答案。所有答案和评论都非常可行。谢谢!     
已邀请:
        正确。 在编译时,该列不存在。也就是说,SQL Server会查看整个命令集并对其进行解析/编译。代码中的ALTER TABLE的效果对以后的命令不可见。 您必须单独对更新执行ALTER TABLE 注意:对于SQL Server 2005,您将拥有varbinary(max),它更加灵活并且消除了一些复杂性     
        您的脚本中有几个问题:
TempDB
不是
tempdb
的正确名称。您的代码将在安装了区分大小写的排序规则的服务器上中断。始终对所有数据库名称使用适当的大小写。如果在区分大小写的部署下运行,您的代码可能会在结果列名称上类似地中断,例如ѭ3。 并发下的逻辑不正确:会话A将看到会话B的#temp表并执行不正确的操作。 一个简单的测试显示这些列是可见的: 。
EXEC (\'SELECT * INTO #RESULTS_TABLE from 
     (select *, newid() as COLUMN_A from master..spt_values) A;
ALTER TABLE #RESULTS_TABLE
ADD IMAGE_DATA varbinary(max);
IF EXISTS(SELECT * FROM TempDB.INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = 
\'\'COLUMN_A\'\' and TABLE_NAME LIKE \'\'#RESULTS_TABLE%\'\')
BEGIN
    update #RESULTS_TABLE 
       set IMAGE_DATA = 0xBAADF00D;
END
SELECT * FROM #RESULTS_TABLE\')
此测试表明该列已更新,因此对EXISTS的检查成功。显而易见的结论是,在您的情况下,#RESULTS_TABLE和#IMAGE_TABLE之间的“ 5”联接找不到任何匹配项,这是一个完全取决于表内容的问题。 编辑 您可以使ѭ3成为动态的,但在测试时仍然可以正常工作:
declare @cn sysname = case 
      when RAND() * 100 >= 50 then \'COLUMN_A\' 
      else \'COLUMN_B\' end;

EXEC (N\'SELECT * INTO #RESULTS_TABLE from (
     select *, newid() as \' + @cn + N\'  from master..spt_values) A;
...
    
        您可以使用来检查临时表中是否存在该列。
IF EXISTS (SELECT * FROM TempDB.INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = \'Column\' AND TABLE_NAME LIKE \'#TempTable%\')
    PRINT \'Column exists\'
ELSE
    PRINT \'Column doesn\'\'t exists\'
    

要回复问题请先登录注册