Как я уже упоминал в комментарии, вы не можете параметризировать имена объектов или часть кода, который должен быть литералом. Например, что-то вроде приведенного ниже не будет работать:
DECLARE @TableName sysname;
SET @TableName = N'MyTable'
SELECT *
FROM @TableName;
Вы получите сообщение о том, что переменная таблицы @TableName
не была объявлена.
Поэтому вам нужноиспользовать динамический SQL и безопасно ввести значения в строку. Я не знаю Python, но я подозреваю это будет работать:
sql = "DECLARE @SQL nvarchar(MAX) = N'BULK INSERT ' + QUOTENAME(?) + N' FROM N' + REPLACE(?,'''','''''') + N' WITH (DATA_SOURCE = ''j'',FIELDTERMINATOR='','',ROWTERMINATOR=''\n'');'; EXEC sp_executesql @SQL;", tablename , files
Причина, по которой я использую REPLACE
в пути к файлу, заключается в том, что тип данных первого параметра QUOTENAME
равен sysname
(фактически nvarchar(128) NOT NULL
), а путь к файлу может быть длиннее 128 символов. Таким образом, QUOTENAME
может усечь значение;поэтому я использовал REPLACE
вместо.