2011-02-16 8 views
12

Następujący kod daje błąd (jej część procedury przechowywanej T-SQL)Jak rzutować zmienne w T-SQL dla wstawiania zbiorczego?

-- 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  
) 

Błąd jest:

Incorrect syntax near the keyword 'with'. 

przypadku wymienić:

FROM @CSVfile 

z :

FROM 'T:\x.csv' 

... to działa ładnie.

Odpowiedz

14

Jak znam tylko ciągiem znaków jest wymagane w z. W takim przypadku trzeba napisać dynamiczne kwerendy użyć BULK INSERT

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

Świetnie, to działało z kilkoma modyfikacjami. Wydaje się, że nie działa, jeśli w ogóle użyłem podwójnych cudzysłowów, twoje rozwiązanie jest prawie idealne. – Contango

+1

Co z SQL Injection? – user441365

1

można spróbować FROM ' + @CSVfile + '

+0

Dzięki, doceń swój czas. – Contango

1

trzeba angażować się w ciąg budynku & następnie wywołanie exec() lub sp_executesql BOL ma przykład:

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

Dziękuję za odpowiedź, doceń to. – Contango

+0

Co z SQL Injection? – user441365

0

Większość czasu zmienna szukam w nazwie pliku jest data, a ten działa idealnie dla luzem Wstawianie plików z data użycia, na przykład w codziennej pracy. Zmień według potrzeb, formatu daty, nazwy tabeli, ścieżki pliku, nazwy pliku i ograniczników.

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

Co z SQL Injection? – user441365