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)
您也需要在动态 SQL 中执行更新(或者只是首先创建包含所有列的表)。发生错误是因为在动态 SQL 运行之前正在解析新列的更新。
顺便说一句,如果您尝试执行存储过程并在工具栏中选择“显示估计的执行计划”,您可能只会收到此错误。这是一个解析/绑定错误,在生成涉及#temp 表的估计计划时会在许多情况下发生,但在正常执行期间不应该发生。
因此,为了避免在检索估计计划期间出现错误,请将任何“新”列引用放在单独的动态 SQL 块中。但要真正避免这个问题:停止检索估计的执行计划。反正它们很不值钱。