更新语句给出无效的列名错误,即使该列存在

IEn*_*les 5 sql-server t-sql alter-table update temporary-tables

我在此存储过程开始时创建了一个临时表。它创建成功,可以从中选择和插入。这是创建语句

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
)
Run Code Online (Sandbox Code Playgroud)

我的问题是在更改临时表后尝试更新列。我收到错误:

消息 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

我认为会更好但仍然抛出无效的列名错误消息 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
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 8

您也需要在动态 SQL 中执行更新(或者只是首先创建包含所有列的表)。发生错误是因为在动态 SQL 运行之前正在解析新列的更新。

顺便说一句,如果您尝试执行存储过程并在工具栏中选择“显示估计的执行计划”,您可能只会收到此错误。这是一个解析/绑定错误,在生成涉及#temp 表的估计计划时会在许多情况下发生,但在正常执行期间不应该发生。

因此,为了避免在检索估计计划期间出现错误,请将任何“新”列引用放在单独的动态 SQL 块中。但要真正避免这个问题:停止检索估计的执行计划。反正它们很不值钱。