2011-02-16 15 views
12

El siguiente código da un error (la parte de un procedimiento de T-SQL almacenado):Cómo moldear variables en T-SQL para inserción masiva?

-- Bulk insert data from the .csv file into the staging table. 
DECLARE @CSVfile nvarchar(255); 
SET @CSVfile = N'T:\x.csv'; 
BULK INSERT [dbo].[TStagingTable] 
-- FROM N'T:\x.csv' -- This line works 
FROM @CSVfile -- This line will not work 
WITH 
(
FIELDTERMINATOR = ',', 
ROWTERMINATOR = '\n', 
FIRSTROW = 2  
) 

El error es:

Incorrect syntax near the keyword 'with'. 

Si sustituyo:

FROM @CSVfile 

con :

FROM 'T:\x.csv' 

... luego funciona bien.

Respuesta

14

Como sé que sólo se requiere cadena literal en el de. En ese caso, usted tiene que escribir una consulta dinámica de utilizar inserción masiva

declare @q nvarchar(MAX); 
set @q= 
    'BULK INSERT [TStagingTable] 
    FROM '+char(39)[email protected]+char(39)+' 
    WITH 
    (
    FIELDTERMINATOR = '','', 
    ROWTERMINATOR = ''\n'', 
    FIRSTROW = 1 
    )' 
exec(@q) 
+0

Brillante, esto funcionó con solo algunas modificaciones. No pareció funcionar si utilicé alguna comilla doble en la consulta, su solución es bastante perfecta. – Contango

+1

¿Qué sucede con la inyección de SQL? – user441365

1

Se puede tratar FROM ' + @CSVfile + '

+0

Gracias, aprecio su tiempo. – Contango

1

que tienen que participar en la cadena de la construcción & luego llamar EXEC() o sp_executesql BOL tiene un ejemplo:

DECLARE @bulk_cmd varchar(1000) 
SET @bulk_cmd = 'BULK INSERT AdventureWorks2008R2.Sales.SalesOrderDetail 
FROM ''<drive>:\<path>\<filename>'' 
WITH (ROWTERMINATOR = '''+CHAR(10)+''')' 
EXEC(@bulk_cmd) 
+0

Gracias por su respuesta, lo aprecio. – Contango

+0

¿Qué hay de la inyección de SQL? – user441365

0

mayoría de las veces la variable que estoy buscando en un nombre de archivo es la fecha, y éste funciona perfectamente para mayor inserción de archivos con fecha, para uso, como en un trabajo diario. Cambie según su necesidad, formato de fecha, nombre de tabla, ruta de archivo, nombre de archivo y delimitadores.

DECLARE @DT VARCHAR (10) 
    DECLARE @INSERT VARCHAR (1000) 
    SET @DT = (CONVERT(VARCHAR(10),GETDATE()-1,120)) 
    SET @INSERT = 'BULK INSERT dbo.table FROM ''C:\FOLDER\FILE'[email protected]+'.txt'''+' WITH (FIRSTROW=2, FIELDTERMINATOR=''\t'', ROWTERMINATOR=''\n'')' 
    EXEC (@INSERT); 
+0

¿Qué hay de la inyección de SQL? – user441365

Cuestiones relacionadas