gpt4 book ai didi

sql - 在 SQL Server 中检查临时表中是否存在列总是返回 false

转载 作者:行者123 更新时间:2023-12-03 02:12:51 25 4
gpt4 key购买 nike

我有以下执行语句,它创建一个表(使用另一个过程中的数据),将值插入到临时表中,添加一个图像列(因为它们不能包含在分组中),然后根据来自另一个临时表的条件(生成的表字段在 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 子句。我已经进行了多次验证,以确保条件既可以为真也可以为假(匹配行、不匹配行等)。所以这就排除了条件语句。谢谢。

编辑:

我仍然不完全确定其确切原因是什么,但我最终创建了一个全局临时表并运行了两个单独的过程,现在它似乎工作正常。我必须接受与我自己的解决方案最接近的答案。所有答案和评论都非常可行。谢谢!

最佳答案

您的脚本中有几个问题:

  • TempDB 不是 tempdb 的正确名称。您的代码将在安装了区分大小写排序规则的服务器上崩溃。所有数据库名称始终使用正确的大小写。如果在区分大小写的部署下运行,您的代码可能会在结果列名称(例如 COLUMN_A)上出现类似的中断。
  • 并发下逻辑不正确: session A 会看到 session 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 之间的 OBJ_ID 连接找不到任何匹配项,这是一个完全取决于表内容的问题。

编辑

您可以将COLUMN_A设为动态,测试时它仍然可以正常工作:

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;
...

关于sql - 在 SQL Server 中检查临时表中是否存在列总是返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6333346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com