[英]SQL IF ELSE insert into #temp table problem
我不確定如何解決。 下面我有一個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.
有人知道我可以解決這個微妙問題的方法嗎?
為什么不簡單地使用布爾邏輯:
IF EXISTS (SELECT 1 FROM #temp)
DROP TABLE #temp
SELECT *
INTO #temp
FROM #tempCity
WHERE (@code= 'All' OR [City_Code] = @code);
首先,您可以免除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
添加數據。
這實際上是編譯器錯誤。 如果您嘗試這樣的事情:
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
語句中兩次創建#test
,而編譯器不喜歡它。
您最好使用這樣的WHERE
作為結果:
SELECT *
INTO #Temp
FROM #TempCity
WHERE City_Code = @Code OR @Code = 'All;
盡管可以使用動態SQL,但臨時對象將僅保留在sp_executesql
創建的會話中; 使它對您毫無用處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.