ストアド プロシージャによる一括挿入: エラーの解決
作業中の一括挿入クエリをストアド プロシージャにカプセル化しようとすると、ユーザーが次のエラーに遭遇しました。 BULK INSERT ステートメント内でファイル変数を使用するときにエラーが発生します。ユーザーのストアド プロシージャ コードは次のようになります:
create proc dbo.InsertZipCode @filepath varchar(500)='e:-digit Commercial.csv' as begin BULK INSERT ZIPCodes FROM @filepath WITH ( FIRSTROW = 2 , FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) end
ただし、このコードでは次のエラーが発生しました:
Msg 102, Level 15, State 1, Procedure InsertZipCode, Line 6 Incorrect syntax near '@filepath'. Msg 319, Level 15, State 1, Procedure InsertZipCode, Line 7 Incorrect syntax near the keyword 'with'. If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon.
この問題の核心は、BULK INSERT が実行できないことにあります。ファイル名を変数として受け入れます。次のようなステートメントは有効ですが、
BULK INSERT ZIPCodes FROM 'e:-digit Commercial.csv' WITH
BULK 内でファイル名変数 (例: DECLARE @filename VARCHAR(255) SET @filename = 'e:5-digit Commercial.csv') を使用します。 INSERT ステートメントは必然的に失敗します。
この問題を解決するには、実行可能なアプローチの 1 つは、BULK INSERT ステートメントを構築することです。文字列 (固定ファイル名) として指定し、sp_executesql:
DECLARE @filepath nvarchar(500) SET @filepath = N'e:-digit Commercial.csv' DECLARE @bulkinsert NVARCHAR(2000) SET @bulkinsert = N'BULK INSERT ZIPCodes FROM ''' + @filepath + N''' WITH (FIRSTROW = 2, FIELDTERMINATOR = '','', ROWTERMINATOR = ''\n'')' EXEC sp_executesql @bulkinsert
を使用して動的に実行します。これらのガイドラインに従うことで、BULK INSERT がファイル名変数を受け入れることができない問題を回避し、正常に実行できるようになります。一括挿入を実行するストアド プロシージャの作成。
以上がSQL Server 一括挿入ストアド プロシージャの「'@filepath' 付近の構文が正しくありません」エラーを修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。