SET - ВЫПОЛНИТЬ в TSQL с переданной переменной - PullRequest
0 голосов
/ 26 октября 2019

Я работаю со вставкой OPENROWSET (BULK...), где я вставляю небольшой файл XML в таблицу перед тем, как в конечном итоге уничтожить и преобразовать его. Следующее работает просто отлично (большое спасибо другим постам).

DECLARE @v_inputfile AS varchar(50)
DECLARE @v_xmlfile AS xml
DECLARE @v_sql AS nvarchar(1000)
DECLARE @v_loadeddatetime AS DATETIME

SET @v_inputfile='E:\inputfile.xml'
SET @v_sql= 'INSERT INTO'+
    ' Tbl1_XMLStaging1 (XMLData, LoadedDateTime)' +
    ' SELECT CONVERT(XML, BulkColumn), ' +
    ' GETDATE() ' +
    'FROM OPENROWSET(BULK '''+ @v_inputfile +''', SINGLE_BLOB) AS x;'
EXEC(@v_sql);

Однако моя цель также вставить INSERT InputFileName в Tbl1_XMLStaging1, но у меня возникают проблемы с @v_inputfile в передаваемой инструкции Selectв качестве переменной в запросе.

Я попробовал следующее:

DECLARE @v_inputfile AS varchar(50)
DECLARE @v_xmlfile AS xml
DECLARE @v_sql AS nvarchar(1000)
DECLARE @v_loadeddatetime AS DATETIME

SET @v_inputfile='E:\inputfile.xml'
SET @v_sql= 'INSERT INTO'+
    ' Tbl1_XMLStaging1 (XMLData, LoadedDateTime, XMLFileName)' +
    ' SELECT CONVERT(XML, BulkColumn), ' +
    ' GETDATE(), ' +
    '@v_inputfile ' +
    'FROM OPENROWSET(BULK '''+ @v_inputfile +''', SINGLE_BLOB) AS x;'
EXEC(@v_sql);

Я получаю различные сообщения об ошибках:

Должен объявить скалярную переменную "@v_inputfile"

Если я удаляю одинарные кавычки вокруг переменной, то получаю ошибку

Неверный синтаксис рядом с 'E:'

Я прочесал несколько предыдущих постови, кажется, не может пройти через это, не выполняя никаких других операций.

После ответа. Я пытаюсь сделать следующее и получаю сообщение об ошибке

Неверный синтаксис рядом с ',

Код:

DECLARE @v_inputfile AS varchar(50)
DECLARE @v_xmlfile AS xml
DECLARE @v_sql AS nvarchar(1000)
DECLARE @v_stmt AS nvarchar(1000)
DECLARE @params AS nvarchar(100)
DECLARE @v_loadeddatetime AS DATETIME

SET @v_inputfile='E:\inputfile.xml'
SET @v_sql= 'INSERT INTO'+
    ' Tbl1_XMLStaging1 (XMLData, LoadedDateTime, XMLFileName)' +
    ' SELECT CONVERT(XML, BulkColumn), ' +
    ' GETDATE(),' +
    ' @v_inputfile ' +
    'FROM OPENROWSET(BULK '''+ @v_inputfile +''', SINGLE_BLOB) AS x;'
EXEC @v_stmt = @v_sql, @params = N'@v_inputfile varchar(50)', @v_inputfile;

Ответы [ 2 ]

1 голос
/ 26 октября 2019

Проблема в том, что в контексте execute нет доступа к переменным, объявленным в другой области. Существует два способа решения этой проблемы.

Вы можете изменить строку '@v_inputfile ' + на '''' + @v_inputfile + '''' +, чтобы указать значение переменной в виде строки в кавычках. Это несколько хрупко и не должно использоваться с вводом, который может быть ненадежным, например, что-то введенное пользователем, иначе вы не встретите Таблицы Бобби .

В качестве альтернативы используйте параметры с sp_executesql:

execute sp_executesql @stmt = @v_sql,
  @params = N'@v_inputfile varchar(50)', @v_inputfile = @v_inputfile

Это гораздо более надежное решение, которое может предотвратить атаки с использованием SQL-инъекций.

0 голосов
/ 27 октября 2019

Следующие работы.

DECLARE @v_inputfile AS varchar(50)
DECLARE @v_xmlfile AS xml
DECLARE @v_sql AS nvarchar(1000)
DECLARE @v_stmt AS nvarchar(1000)
DECLARE @params AS nvarchar(100)
DECLARE @v_loadeddatetime AS DATETIME

SET @v_inputfile='E:\inputfile.xml'
SET @v_sql= 'INSERT INTO'+
    ' Tbl1_XMLStaging1 (XMLData, LoadedDateTime, XMLFileName)' +
    ' SELECT CONVERT(XML, BulkColumn), ' +
    ' GETDATE(),' +
    ' @v_inputfile ' +
    'FROM OPENROWSET(BULK '''+ @v_inputfile +''', SINGLE_BLOB) AS x;'
EXECUTE sp_executesql @v_stmt = @v_sql, 
    @params = N'@v_inputfile varchar(50)', @v_inputfile = @v_inputfile;
...