Как использовать переменную в команде Openrowset

Я пытаюсь использовать переменный путь к файлу в команде SQL Openrowset. Я знаю, что он не может явно принимать переменную и что мне нужно использовать динамический SQL.

Что сейчас работает -

SELECT @file_stream = CAST(bulkcolumn AS VARBINARY(MAX))
FROM OPENROWSET(BULK 'C:\Temp\print4.pdf', SINGLE_BLOB) AS x

Однако, если я попытаюсь использовать свой переменный путь к файлу

declare @file_stream VARBINARY(MAX)

declare @filePath NVARCHAR(128)
set @filePath = 'C:\Temp\print4.pdf'

set @command = N'SELECT @file_stream = CAST(bulkcolumn AS varbinary(MAX))
                from OPENROWSET(BULK ' + @filePath + ',
                SINGLE_BLOB) ROW_SET'

EXEC sp_executesql @command, @filePath, @file_stream;

Я получаю сообщение об ошибке «Сообщение 137, уровень 15, состояние 2, строка 15. Необходимо объявить скалярную переменную @filePath».

Я уверен, что это проблема синтаксиса, но пока не смог понять, как его следует форматировать.


person bjjrolls    schedule 03.10.2016    source источник
comment
Проверьте эту ссылку Может быть, вам поможет.   -  person starko    schedule 03.10.2016
comment
@starko На самом деле я просто смотрел на этот вопрос. Это немного полезно, но, похоже, не имеет прямого отношения к моей проблеме. Я пытался включить переменную в двойные кавычки, как в вопросе, но безрезультатно.   -  person bjjrolls    schedule 03.10.2016


Ответы (1)


Измените свой сценарий, как показано ниже.

DECLARE @file_stream VARBINARY(MAX)
DECLARE @command nvarchar(1000)
DECLARE @filePath NVARCHAR(128)
set @filePath = 'C:\Temp\print4.pdf'

set @command = N'SELECT @file_stream1 = CAST(bulkcolumn AS varbinary(MAX))
                from OPENROWSET(BULK ''' + @filePath + ''',
                SINGLE_BLOB) ROW_SET'

EXEC sp_executesql @command, N'@file_stream1 VARBINARY(MAX) OUTPUT',@file_stream1 =@file_stream OUTPUT

select @file_stream

Пример вывода: введите здесь описание изображения

person Unnikrishnan R    schedule 03.10.2016
comment
Не могли бы вы немного объяснить, что происходит в строке EXEC? Я изменил свой сценарий на этот, но все еще вижу сообщение об ошибке... Необходимо объявить скалярную переменную @file_stream. - person bjjrolls; 03.10.2016
comment
я думаю, вы не изменили переменную, используемую внутри динамического запроса. измените его на file_stream1 . Также убедитесь, что переменная объявлена ​​в команде выполнения. В строке выполнения результат динамического запроса передается в выходную переменную file_stream1 для ее вывода. - person Unnikrishnan R; 03.10.2016