SQL IF ELSE插入#temp表问题

时间:2019-05-08 14:10:06

标签: sql sql-server

我有一个不确定的解决方案。在下面,我有一个if else语句以及将数据插入到临时表中。

IF @code= 'All'
    BEGIN
        DROP TABLE IF EXISTS #temp
        SELECT * 
        INTO #temp
        FROM #tempCity
    END
ELSE
    BEGIN
        DROP TABLE IF EXISTS #temp
        SELECT * 
        INTO #temp
        FROM #tempCity
        WHERE [City_Code] = @code
    END

值得注意的是,我确实需要表#temp在两种情况下都具有相同的名称,因为稍后我将使用它,并且插入的内容可能因情况而异,这就是为什么我没有定义为#temp

我收到一条错误消息,说明在这种情况下这是可以理解的:

There is already an object named '#temp' in the database.

有人知道我可以解决这个细微问题的方法吗?

3 个答案:

答案 0 :(得分:3)

为什么不简单地使用布尔逻辑:

IF EXISTS (SELECT 1 FROM #temp)
   DROP TABLE #temp

SELECT * 
INTO #temp
FROM #tempCity
WHERE (@code= 'All' OR [City_Code] = @code);

答案 1 :(得分:0)

首先,您可以省去IF

SELECT * 
INTO #temp
FROM #tempCity
WHERE @code = 'All' OR [City_Code] = @code;

第二,问题是 compile 时间错误。也就是说,SELECT INTO失败,因为该表存在。您可以使用GO解决此问题:

DROP TABLE IF EXISTS #temp;
GO

SELECT * 
INTO #temp
FROM #tempCity
WHERE @code = 'All' OR [City_Code] = @code;

但这在存储过程,函数或触发器中将不起作用。另一种选择是使用动态SQL:

DROP TABLE IF EXISTS #temp;

EXEC '
SELECT * 
INTO #temp
FROM #tempCity
WHERE @code = ''All'' OR [City_Code] = @code
';

但是我认为最好的解决方案是使用表变量。这些超出范围时将被删除。这意味着您可以声明它们并假定它们不存在。然后使用INSERT添加数据。

答案 2 :(得分:0)

这实际上是编译器错误。如果您尝试这样的操作:

DROP TABLE #test;
GO

DECLARE @Code int;

IF @Code IS NULL BEGIN

    CREATE TABLE #test (ID int);
END ELSE BEGIN

    CREATE TABLE #test (ID int);
END

GO
DROP TABLE #test;

假设#test从一开始就不存在,那么您会得到以下错误:

Msg 3701, Level 11, State 5, Line 1
Cannot drop the table '#test', because it does not exist or you do not have permission.
Msg 2714, Level 16, State 1, Line 11
There is already an object named '#test' in the database.
Msg 3701, Level 11, State 5, Line 15
Cannot drop the table '#test', because it does not exist or you do not have permission.

这实际上表明从未创建#test。这是因为您尝试在同一条语句中创建两次#test,而编译器不喜欢它。

使用WHERE作为结果可能会更好:

SELECT *
INTO #Temp
FROM #TempCity
WHERE City_Code = @Code OR @Code = 'All;

尽管您可以使用动态SQL,但临时对象将仅在sp_executesql创建的会话中保留;使它对您毫无用处。