Inserción masiva utilizando procedimiento almacenado

Tengo una consulta que funciona bien:

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

pero ahora quiero crear un procedimiento almacenado para ello.

He escrito el código siguiente para hacer su procedimiento almacenado:

 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 

pero muestra un error:

Msg 102, nivel 15, estado 1, procedimiento InsertZipCode, línea 6 Sintaxis incorrecta cerca de '@filepath'.

Msg 319, nivel 15, estado 1, procedimiento InsertZipCode, línea 7 Sintaxis incorrecta cerca de la palabra key 'con'. Si esta instrucción es una expresión de tabla común, una cláusula xmlnamespaces o una cláusula de context de seguimiento de cambios, la instrucción anterior debe terminarse con un punto y coma.

Dígame qué estoy haciendo mal y qué puedo hacer para que funcione en el procedimiento almacenado.

Gracias

No hay nada de malo en su código de procedimiento almacenado: el punto es: el command BULK INSERT no puede aceptar un nombre de file como variable.

Esto funciona:

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

pero esto nunca funciona, dentro de un process almacenado o no:

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

Entonces, simplemente no puedes hacerlo de esta manera, desafortunadamente. Podría considerar build su BULK INSERT como una cadena (con un nombre de file fijo) y luego ejecutarla como SQL dynamic, pero realmente no veo ninguna otra solución.

 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 

Simplemente testing, creo que debes upload este file CSV directamente a la unidad 'E'. Para eso, necesitas tener derechos de administrador, creo, o preguntar a alguien que esté en la administración de la database.

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