Подтвердить что ты не робот

Как отличать переменные в T-SQL для массовой вставки?

Следующий код дает ошибку (ее часть хранимой процедуры T-SQL):

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

Ошибка:

Incorrect syntax near the keyword 'with'. 

Если я заменю:

FROM @CSVfile

с:

FROM 'T:\x.csv'

... тогда он работает красиво.

4b9b3361

Ответ 1

Как я знаю, в строке требуется только буквальная строка. В этом случае вам нужно написать динамический запрос, чтобы использовать объемную вставку

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

Ответ 3

Можете ли вы попробовать FROM ' + @CSVfile + '

Ответ 5

вам нужно заняться строкой, а затем вызвать EXEC() или sp_executesql BOL имеет пример:

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

Ответ 6

В большинстве случаев переменная, которую я ищу в имени файла, - это дата, и это отлично работает для массового вставки файлов с датой, для использования, например, в повседневной работе. Изменение в соответствии с вашими потребностями, формат даты, имя таблицы, путь к файлу, имя файла и разделители.

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