我有以下代码块:
DECLARE @TTable VARCHAR(MAX)= 'SELECT X.* ';
SELECT @TTable+='
INTO ##NewTemp1' + convert(varchar(6), @TStamp) + '
FROM (
SELECT *
FROM ##Temp1' + convert(varchar(6), @TStamp) + '
UNION
SELECT *
FROM ##Temp2' + convert(varchar(6), @TStamp) + '
UNION
SELECT *
FROM ##Temp3' + convert(varchar(6), @TStamp) + '
...
etc
...
UNION
SELECT *
FROM ##Temp22' + convert(varchar(6), @TStamp) + '
UNION
SELECT *
FROM ##Temp23' + convert(varchar(6), @TStamp) + '
) X'
PRINT(@TTable);
EXECUTE(@TTable);
问题是,有时一个(或多个)临时表不会被创建。当发生这种情况时,这段代码会失败,因为它试图联合一个不存在的表。
我知道我可以使用以下代码行来确定是否存在临时表:
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
但我如何将其整合到一个字符串中,就像我使用上面的(@TTable)来检查并确保在联合它之前存在一个表?
答案 0 :(得分:1)
最好的办法是彻底摆脱这种混乱,但如果你要坚持在动态全局临时表之间移动数据,那么你需要动态构建字符串:
<img src="<?php $img=wp_get_attachment_image_src(
get_post_thumbnail_id($post->ID),large);
echo $img[0]; ?>" alt="<?php the_title(); ?>"
style="display:block; width:50%;"/>
最后一行是为了避免DECLARE @TTable VARCHAR(MAX) = 'SELECT X.col1, X.col2' -- Because we NEVER use SELECT *
SELECT @TTable += ' INTO ##NewTemp1' + CONVERT(VARCHAR(6), @TStamp) + -- You should probably put a format here
' FROM ('
IF (OBJECT_ID('##Temp1' + CONVERT(VARCHAR(6), @TStamp)) IS NOT NULL)
SELECT @TTable += 'SELECT col1, col2 FROM ##Temp1' + CONVERT(VARCHAR(6), @TStamp) + '
UNION
'
... Repeat for each temp table
SELECT @TTable += ' SELECT 1 AS col1, 1 AS col2 WHERE 1=0) X'
在最后悬空,因为您不知道哪些临时表可能存在。