Inserimento di massa utilizzando la stored procedure

Ho una query che funziona bene:

BULK INSERT ZIPCodes FROM 'e:\5-digit Commercial.csv' WITH ( FIRSTROW = 2 , FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) 

ma ora voglio creare una procedura memorizzata per questo.

Ho scritto sotto il codice per rendere la sua stored procedure:

 create proc dbo.InsertZipCode @filepath varchar(500)='e:\5-digit Commercial.csv' as begin BULK INSERT ZIPCodes FROM @filepath WITH ( FIRSTROW = 2 , FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) end 

ma il suo errore di visualizzazione:

Messaggio 102, livello 15, stato 1, procedura InsertZipCode, riga 6 syntax non corretta vicino a “@filepath”.

Messaggio 319, livello 15, stato 1, procedura InsertZipCode, riga 7 Sintassi non corretta accanto alla parola chiave ‘con’. Se questa istruzione è un’espressione di tabella comune, una clausola xmlnamespaces o una clausola di contesto di rilevamento delle modifiche, l’istruzione precedente deve essere terminata con un punto e virgola.

Per favore dimmi cosa sto facendo male e cosa posso fare per farlo funzionare in stored procedure.

Grazie

Non c’è niente di sbagliato nel codice di stored procedure – il punto è: il comando BULK INSERT non può accettare un nome di file come variabile.

Questo funziona:

 BULK INSERT ZIPCodes FROM 'e:\5-digit Commercial.csv' WITH 

ma questo non funziona mai – all’interno di un proc memorizzato o meno:

 DECLARE @filename VARCHAR(255) SET @filename = 'e:\5-digit Commercial.csv' BULK INSERT ZIPCodes FROM @filename WITH 

Quindi non puoi farlo in questo modo, sfortunatamente. Potresti considerare di build la tua BULK INSERT come una stringa (con un nome di file fisso) e quindi eseguirla come SQL dinamico, ma non vedo alcuna altra soluzione.

 DECLARE @filepath nvarchar(500) SET @filepath = N'e:\5-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 

Devi solo provarlo, penso che devi caricare questo file CSV direttamente sul disco ‘E’. Per questo è necessario avere i diritti di amministratore, credo, o chiedere a qualcuno che è in amministrazione di database.

 create procedure dbo.InsertZipCode AS BEGIN SET NOCOUNT ON; BULK INSERT ZIPCodes from 'e:\5-digit Commercial.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) END