当它们不存在时处理全局临时表

时间:2016-05-09 18:58:23

标签: sql sql-server-2008-r2

我有以下代码块:

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)来检查并确保在联合它之前存在一个表?

1 个答案:

答案 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' 在最后悬空,因为您不知道哪些临时表可能存在。