【发布时间】:2011-09-14 01:41:12
【问题描述】:
我有以下执行语句,它创建一个表(使用来自另一个过程的数据),将值插入一个临时表,添加一个图像列(因为它们不能包含在分组中),然后根据它更新它来自另一个临时表的标准(生成的表字段在 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 子句。我已经进行了多次验证,以确保条件既可以是真也可以是假(匹配行、不匹配行等)。所以这排除了条件语句。谢谢。
编辑:
我仍然不完全确定它的确切原因是什么,但我最终创建了一个全局临时表并运行了两个单独的过程,现在它似乎工作正常。我不得不接受与我自己的解决方案最匹配的答案。所有答案和 cmets 都非常可行。谢谢!
【问题讨论】:
-
首先,我会尝试省略条件
WHERE A.COLUMN_A = B.IMAGE_VALUE,这对我来说足以通过OBJ_ID找到正确的行 -
感谢您指出这一点。在我的情况下,我需要同时具备这两个条件,因为有些行具有重复的 OBJ_ID。我简化了我的原始代码,也应该把它去掉,因为它看起来确实有误导性。我将编辑问题。
-
不确定这是否有帮助,但我认为您可以像
cast(null as Image) as IMAGE_DATA这样在您的选择语句中添加图像列,而无需将其添加到 group by 子句中,因为它是一个常量。顺便说一句,您为什么需要测试该列是否存在? -
@Mikael Eriksson - 添加演员表只会让我删除 ALTER TABLE 语句。虽然效率更高,但并不能解决我的问题。不过感谢您的提示!我必须检查该列是否存在,因为我正在从另一个过程中提取动态列,并且 IMAGE_DATA 会根据该列是否存在来填充。我已经编辑了问题,使其更依赖于被检查的列。
标签: sql sql-server tsql exec temp-tables