Sql-Server
更新語句給出了無效的列名錯誤,即使該列存在
我在這個儲存過程的開頭創建了一個臨時表。創建成功,可以選擇插入。這是創建語句
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 塊中。但要真正避免這個問題:停止檢索估計的執行計劃。反正他們是很不值錢的。