透過儲存程序批次插入:解決錯誤
在嘗試將工作批次插入查詢封裝到預存程序時,使用者遇到了在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 語句不可避免地會失敗。
要解決此問題,一種可行的方法是將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中文網其他相關文章!