我有一个不确定的解决方案。在下面,我有一个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.
有人知道我可以解决这个细微问题的方法吗?
答案 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
创建的会话中保留;使它对您毫无用处。