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”.
- SQL: selezionare il nome della colonna dynamic in base alla variabile
- Perché eseguire stored procedure è più veloce della query SQL da uno script?
- Looping Over Result Imposta in MySQL
- L'assegnazione dei parametri di input della stored procedure alle variabili locali aiuta a ottimizzare la query?
- Controlla se un parametro è nullo o vuoto in una stored procedure
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