2010-10-29 15 views
26

almacena Tengo una consulta que está trabajando muy bien:inserción a granel utilizando el procedimiento

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

pero ahora quiero crear un procedimiento almacenado en la memoria.

he escrito debajo de código 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 su muestra de error:

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.

Por favor, dime lo que estoy haciendo mal y lo que puedo hacer para que sea trabajar en procedimiento almacenado.

Gracias

Respuesta

35

No hay nada malo con su código de procedimiento almacenado - el punto es: el comando BULK INSERT no puede aceptar un nombre de archivo como una variable.

Esto funciona:

pero esto nunca funciona - dentro de un proc almacenado o no:

DECLARE @filename VARCHAR(255) 
SET @filename = 'e:\5-digit Commercial.csv' 

BULK INSERT ZIPCodes 
FROM @filename 
WITH 

Así que simplemente no puede hacerlo de esta manera, por desgracia. Podría considerar construir su declaración BULK INSERT como una cadena (con un nombre de archivo fijo) y luego ejecutarla como SQL dinámico, 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 
+0

gracias ya lo he hecho como una cadena y lo ejecuto utilizando el comando exec, pero pensé que podría haber otras soluciones. muchas gracias. –

+0

marc_s pero ¿puedo ejecutar EXEC sp_executesql @bulkinsert del procedimiento? entonces mi interfaz de C# llamará a mi procedimiento de SQL, pasará parámetros (ruta de archivo, nombre de tabla) y creará una cadena y llamará a SQL dinámico. – Andrey

1

Acaba de probarlo, creo que tiene que cargar este archivo CSV directamente en la unidad 'E'. Para eso, necesitas tener derechos de administrador, creo, o preguntar a alguien que esté en la administración de la base de datos.

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