Sql-Server

更新語句給出了無效的列名錯誤,即使該列存在

  • December 30, 2015

我在這個儲存過程的開頭創建了一個臨時表。創建成功,可以選擇插入。這是創建語句

CREATE TABLE #tmpImportData 
( GuideFirstName VARCHAR(MAX), 
 GuideLastName VARCHAR(MAX), 
 email VARCHAR(MAX), 
 group_id_text VARCHAR(MAX), 
 CandidateName VARCHAR(MAX), 
 grade_text VARCHAR(5), 
 dateofbirth DATE
)

我的問題是在更改臨時表後嘗試更新列。我得到錯誤:

消息 207,級別 16,狀態 1

無效的列名

程式碼:

declare @SQl1 nvarchar(max)
set @SQL1 ='
ALTER TABLE #tmpImportData 
ADD group_id INT
ALTER TABLE #tmpImportData 
ADD guide_id INT
ALTER TABLE #tmpImportData 
ADD password_plain_text VARCHAR(500)
ALTER TABLE #tmpImportData 
ADD guide_email VARCHAR(500)
ALTER TABLE #tmpImportData 
ADD class_id INT'

exec sp_executesql @Sql1

UPDATE #tmpImportData 
SET group_id = CAST(group_id_text AS INT)

UPDATE #tmpImportData 
SET group_id = 0 WHERE group_id IS NULL

解決方案不再是解決方案,它不再起作用

declare @SQl1 nvarchar(max)
set @SQL1 ='
ALTER TABLE #tmpImportData ADD group_id INT
ALTER TABLE #tmpImportData ADD guide_id INT
ALTER TABLE #tmpImportData ADD password_plain_text VARCHAR(500)
ALTER TABLE #tmpImportData ADD guide_email VARCHAR(500)
ALTER TABLE #tmpImportData ADD class_id INT'

exec sp_executesql @Sql1
WAITFOR DELAY '000:00:05'

UPDATE #tmpImportData SET group_id = CAST(group_id_text AS INT)
UPDATE #tmpImportData SET group_id = 0 WHERE group_id IS NULL

我認為會更好,但仍然拋出無效的列名錯誤消息 207,級別 16,狀態 1,第 2 行無效的列名“group_id”。

 declare @SQl1 nvarchar(max)
set @SQL1 ='
ALTER TABLE #tmpImportData ADD group_id INT, guide_id INT, password_plain_text VARCHAR(500), guide_email VARCHAR(500), class_id INT; UPDATE #tmpImportData SET group_id = CAST(group_id_text AS INT);
UPDATE #tmpImportData SET group_id = 0 WHERE group_id IS NULL; '

exec sp_executesql @Sql1
WAITFOR DELAY '000:00:05'

--UPDATE #tmpImportData SET group_id = CAST(group_id_text AS INT)
--UPDATE #tmpImportData SET group_id = 0 WHERE group_id IS NULL

SELECT * FROM #tmpImportData

您還需要在動態 SQL 中執行更新(或者首先創建包含所有列的表)。發生錯誤是因為在動態 SQL 執行之前正在解析新列的更新。

順便說一句,如果您嘗試執行儲存過程並在工具欄中選擇“顯示估計的執行計劃”,您可能只會收到此錯誤。這是一個解析/綁定錯誤,在生成涉及#temp 表的估計計劃時會在許多情況下發生,但在正常執行期間不應發生。

因此,為了避免在檢索估計計劃期間出錯,請將任何“新”列引用放在單獨的動態 SQL 塊中。但要真正避免這個問題:停止檢索估計的執行計劃。反正他們是很不值錢的。

引用自:https://dba.stackexchange.com/questions/84661