0

我有一个场景,我不确定如何解决。下面我有一个 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.

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

4

3 回答 3

3

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

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

SELECT * 
INTO #temp
FROM #tempCity
WHERE (@code= 'All' OR [City_Code] = @code);
于 2019-05-08T14:13:42.753 回答
0

首先,您可能可以省去IF

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

其次,问题是编译时错误。也就是说,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添加数据。

于 2019-05-08T14:14:20.347 回答
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;创建的会话中持续存在。让它对你毫无用处。

于 2019-05-08T14:22:46.580 回答