微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决检查临时表中是否存在列在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\'
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。