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

Использование переменной в запросе OPENROWSET

У меня возникают проблемы с этим запросом:

SELECT * 
FROM OPENROWSET(
    'SQLNCLI',
    'DRIVER={SQL Server};',
    'EXEC dbo.sProc1 @ID = ' + @id 
 )

Дает ошибку:

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

Кто-нибудь знает, почему я получаю эту ошибку?

4b9b3361

Ответ 1

Как было предложено Скоттом, вы не можете использовать выражения в OPENROWSET. Попробуйте создать динамический sql для передачи параметров

Declare @ID int
Declare @sql nvarchar(max)
Set @ID=1
Set @sql='SELECT * 
FROM OPENROWSET(
               ''SQLNCLI'',
               ''DRIVER={SQL Server};'',
               ''EXEC dbo.usp_SO @ID =' + convert(varchar(10),@ID) + ''')'

-- Print @sql
 Exec(@sql)

Ответ 2

OPENROWSET требует строковых литералов, а не выражений. Он жалуется на знак плюса, потому что он не ожидает ничего больше, чем строковый литерал, и вы рассказали строковый литерал с оператором.

См. http://msdn.microsoft.com/en-us/library/ms190312.aspx, который гласит:

'запрос'

Является строковой константой, отправленной и выполняемой поставщиком...

Ответ 3

Declare @Route VARCHAR(200)
Declare @sql nvarchar(max)
Set @Route='C:\OCRevisiones.xlsx;'
Set @sql='SELECT * INTO FFFF
FROM OPENROWSET(
               ''Microsoft.ACE.OLEDB.12.0'',
               ''Excel 12.0;HDR=YES;Database=' + @Route + ''',
               ''SELECT * FROM [Sheet1$]'')'

 Print @sql
 --Exec(@sql)

Ответ 4

За что это стоит. Причина, по которой мы используем openrowset, а не прямой запрос на сервер, заключается в том, что обработка связанного запроса сервера происходит на локальном сервере. (Медленно и часто возвращает большую часть таблицы)

Да, мы можем выполнить конкатенацию строк, как указано выше.

Другой вариант, когда у вас легкость синтаксиса и мощность параметров.

Создайте сохраненную proc в удаленном поле, у этого proc есть все необходимые параметры. Вызовите сохраненную процедуру proc со стандартным запросом на связанный сервер (такой же, как и выше, или выше, чем вышеупомянутое, и значительно проще кодировать.

например. linkedservername.database.dbo.myproc 123, 'abc', 'someparam', getdate()

Просто вариант....