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

Cup*_*ppM 12 sql sql-server-2005 temp-tables insert-into

我正在尝试根据SQL 2005中的条件结果填充临时表.临时表将具有相同的结构,但将根据条件使用不同的查询填充.下面的简化示例脚本在ELSE块的语法检查中失败,INSERT 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
Run Code Online (Sandbox Code Playgroud)

我可以在IF/ELSE语句之前创建临时表,然后只INSERT SELECT在条件块中执行语句,但是表会有很多列,我试图提高效率.这是唯一的选择吗?或者有一些方法可以使这项工作?

谢谢,马特

Phi*_*ley 9

您遇到的问题不是您正在填充临时表,而是您正在尝试创建表.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
Run Code Online (Sandbox Code Playgroud)

但临时表只持续动态会话.所以,唉,看起来你必须首先声明表然后填充它.也许是编写和支持的笨拙代码,但它会足够有效地执行.


Joh*_*ock 6

在您提供的场景中您可以这样做

DECLARE @Id int
SET @Id = 1

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

SELECT 
  CASE WHEN (@Id = 2) 
    THEN 'ABC' 
    ELSE 'XYZ' 
  END AS Letters
INTO #MyTestTable;
Run Code Online (Sandbox Code Playgroud)

但否则你需要像if statement这样之前创建表

Create Table #MyTestTable (
  MyValue varchar(3)
)
IF (@Id = 2) BEGIN 
  Insert Into (MyValue)
  SELECT 'ABC' AS Letters;
END ELSE BEGIN
  Insert Into (MyValue)
  SELECT 'XYZ' AS Letters;
END
Run Code Online (Sandbox Code Playgroud)


Gas*_*a79 5

回答迟了8年,但我很惊讶没人想到:

select * into #MyTempTable from...
where 1=2

IF -- CONDITION HERE
insert into #MyTempTable select...
ELSE
insert into #MyTempTable select...
Run Code Online (Sandbox Code Playgroud)

简单,快速,而且有效.不需要动态sql

  • 杰出的!多年后对于我们这些寻求帮助的人来说仍然很棒。 (2认同)
  • 确实是一个很好的解决方案,但想补充一点,“选择前 0 *”会比强加一个条件更好。此外,如果原始表包含标识列,则必须在插入之前将其禁用。 (2认同)