小编典典

SQL在If和Else块中插入到临时表中

sql

我正在尝试根据SQL
2005中条件的结果填充临时表。两种方法中的临时表都具有相同的结构,但是将根据条件使用不同的查询进行填充。下面的简化示例脚本未能对ELSEINSERT INTO进行语法检查,并出现以下错误:

数据库中已经有一个名为“ #MyTestTable”的对象。

DECLARE @Id int
SET @Id = 1

IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE #MyTestTable

IF (@Id = 2) BEGIN 
    SELECT 'ABC' AS Letters
    INTO #MyTestTable;
END ELSE BEGIN
    SELECT 'XYZ' AS Letters
    INTO #MyTestTable;
END

我可以在IF/ELSE语句之前创建临时表,然后只INSERT SELECT在条件块中执行语句,但是该表将包含很多列,并且我试图提高效率。那是唯一的选择吗?还是有某种方法可以使这项工作?

谢谢,马特


阅读 195

收藏
2021-05-05

共1个答案

小编典典

您遇到的问题不是您正在填充临时表,而是试图 创建
表。SQL解析您的脚本,发现您试图在两个不同的地方创建它,因此引发了错误。认识到“执行路径”可能无法同时击中两个创建状态时,还不够聪明。使用动态SQL是行不通的。我试过了

DECLARE @Command  varchar(500)

DECLARE @Id int 
SET @Id = 2

IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE #MyTestTable

IF (@Id = 2) BEGIN  
    SET @Command = 'SELECT ''ABC'' AS Letters INTO #MyTestTable'
END ELSE BEGIN 
    SET @Command = 'SELECT ''XYZ'' AS Letters INTO #MyTestTable'
END

EXECUTE (@Command)

select * from #MyTestTable

但是临时表只持续与动态会话一样长的时间。所以,a,您似乎必须先声明该表,然后填充它。可能难以编写和支持的代码,但是它会足够有效地执行。

2021-05-05