Как отличать переменные в 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'
... тогда он работает красиво.
Ответы
Ответ 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)
Ответ 2
Вы пытались использовать динамический SQL?
SET @SQL = "BULK INSERT TmpStList FROM '"[email protected]+"' WITH (FIELDTERMINATOR = '"",""') "
а затем
EXEC(@SQL)
Ref.: http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file
Ответ 3
Можете ли вы попробовать FROM ' + @CSVfile + '
Ответ 4
Требуется строковый литерал.
http://msdn.microsoft.com/en-us/library/ms188365.aspx
Вы можете использовать динамический sql для генерации строкового литерала.
Ответ 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);