【问题标题】:Temporary Table in if statementif 语句中的临时表
【发布时间】:2012-07-27 15:11:00
【问题描述】:
IF @someVariable = 0
BEGIN
    SELECT * 
    INTO #TempTable
    FROM MyTable
    WHERE Category="Something"
END
ELSE
BEGIN
    SELECT * 
    INTO #TempTable
    FROM MyTable
    WHERE Category="SomethingElse"
END
DROP TABLE #TempTable

提出“数据库中已经有一个名为'#TempTable'的对象。有没有办法解决这个问题?

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

表变量是否适合您的需求...由于这些范围问题,我更喜欢这些。

DECLARE @TempTable TABLE (
    -- Your definition
)

IF @someVariable = 0
BEGIN
    INSERT INTO @TempTable (...)
    SELECT ...
    FROM MyTable
    WHERE Category="Something"
END
ELSE
BEGIN
    INSERT INTO @TempTable (...)
    SELECT ...
    FROM MyTable
    WHERE Category="SomethingElse"
END

或者您是否试图避免必须显式定义列?您可以重构以预先确定条件吗:

DECLARE @Category varchar(100)
IF @someVariable = 0
BEGIN
    SET @Category = "Something"
END
ELSE
BEGIN
    SET @Category = "SomethingElse"
END

SELECT * 
INTO #TempTable
FROM MyTable
WHERE Category = @Category

DROP TABLE #TempTable

【讨论】:

  • 不过,它不一定是表变量。同样的方法也适用于临时表。
  • 那么你想做什么......只是绕过明确声明列定义?
  • 您的意思是在 OP 上解决这个问题吗?无论如何,您可能忘记在SELECT ... 之后删除INTO @TempTable(在两个查询中)。
【解决方案2】:
IF @someVariable = 0
BEGIN
   SELECT * 
   INTO #TempTable1
   FROM MyTable
   WHERE Category="Something"
   DROP TABLE #TempTable1
 END
ELSE
 BEGIN
   SELECT * 
   INTO #TempTable2
   FROM MyTable
   WHERE Category="SomethingElse"
   DROP TABLE #TempTable2
END

这可行,但取决于您可能需要代码执行的其他操作,这可能不是最佳解决方案;但在您的示例代码中,它解决了问题。

或者:

SELECT * into #TempTable from MyTable where (1=0)

IF @someVariable = 0
   INSERT INTO #TempTable SELECT * FROM MyTable WHERE Category="Something"
ELSE
   INSERT INTO #TempTable SELECT * FROM MyTable WHERE Category="OtherSomething"

DROP TABLE #TempTable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多