web-dev-qa-db-ja.com

列が存在するにもかかわらず、更新ステートメントで無効な列名エラーが発生する

このストアドプロシージャの最初に一時テーブルを作成しました。これは正常に作成され、そこから選択して挿入できます。これが作成ステートメントです

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
5
JohnOsborne

動的SQLでも更新を実行する必要があります(または、最初にすべての列を含むテーブルを作成するだけです)。動的SQLが実行される前に、新しい列を使用した更新が解析されているため、エラーが発生しています。

余談ですが、ストアドプロシージャを実行してツールバーの[推定実行プランを表示する]を選択した場合にのみ、このエラーが発生する可能性があります。これは、#tempテーブルを含む推定計画を生成するときに多くのシナリオで発生する解析/バインディングエラーですが、通常の実行中には発生しません。

したがって、推定プランの取得中のエラーを回避するには、「新しい」列参照を個別の動的SQLブロックに配置します。しかし、問題を本当に回避するには、推定実行計画の取得を停止します。とにかく、彼らはかなり価値がありません。

8
Aaron Bertrand

お送りいただいたコードで問題を再現することはできません。行に警告メッセージが1つだけ表示される

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

無効な列名group_idなど(列が一時テーブルに動的に追加されるため)

投稿で指定したコードで問題が発生しているかどうかを再確認できますか?

1
Jeena

同様の問題が発生しましたInvalid Column Name pidですが、私の手順にはpidという名前のテーブルフィールドさえ含まれていませんでした。問題は、適切にクリアされなかった他のストアドプロシージャで同じ一時テーブル名を使用したため、現在の一時テーブルの名前を、今まで使用したことがない別の名前に変更し、正常に機能したことです。

したがって、一時テーブルの名前を、過​​去に使用したことがない名前に変更します。

0
Ibm Seidu