включая параметры в OPENQUERY

Как может я использовать параметр внутри sql openquery, такой как:

SELECT * FROM OPENQUERY([NameOfLinkedSERVER], 'SELECT * FROM TABLENAME
where field1=@someParameter') T1 INNER JOIN MYSQLSERVER.DATABASE.DBO.TABLENAME
T2 ON T1.PK = T2.PK
79
задан Sarfraz 31 July 2010 в 14:33
поделиться

3 ответа

В документации OPENQUERY говорится, что:

OPENQUERY не принимает переменные за свои аргументы.

См. Эту статью для временного решения.

ОБНОВЛЕНИЕ:

Как и было предложено, я включаю рекомендации из статьи ниже.

Передача базовых значений

Если базовый оператор Transact-SQL известен, но вам необходимо передать одно или несколько конкретных значений, используйте код, аналогичный приведенному в следующем примере:

DECLARE @TSQL varchar(8000), @VAR char(2)
SELECT  @VAR = 'CA'
SELECT  @TSQL = 'SELECT * FROM OPENQUERY(MyLinkedServer,''SELECT * FROM pubs.dbo.authors WHERE state = ''''' + @VAR + ''''''')'
EXEC (@TSQL)

Передайте весь запрос

] Если вам нужно передать весь запрос Transact-SQL или имя связанного сервера (или и то, и другое), используйте код, похожий на следующий пример:

DECLARE @OPENQUERY nvarchar(4000), @TSQL nvarchar(4000), @LinkedServer nvarchar(4000)
SET @LinkedServer = 'MyLinkedServer'
SET @OPENQUERY = 'SELECT * FROM OPENQUERY('+ @LinkedServer + ','''
SET @TSQL = 'SELECT au_lname, au_id FROM pubs..authors'')' 
EXEC (@OPENQUERY+@TSQL) 

Используйте хранимую процедуру Sp_executesql

Чтобы избежать многократного -слойные кавычки используйте код, похожий на следующий пример:

DECLARE @VAR char(2)
SELECT  @VAR = 'CA'
EXEC MyLinkedServer.master.dbo.sp_executesql
N'SELECT * FROM pubs.dbo.authors WHERE state = @state',
N'@state char(2)',
@VAR
143
ответ дан 24 November 2019 в 10:10
поделиться

Вы можете выполнить строку с OPENQUERY после ее создания. Если вы пойдете по этому пути, подумайте о безопасности и позаботьтесь о том, чтобы не объединять вводимый пользователем текст в ваш SQL!

DECLARE @Sql VARCHAR(8000)
SET @Sql = 'SELECT * FROM Tbl WHERE Field1 < ''someVal'' AND Field2 IN '+ @valueList 
SET @Sql = 'SELECT * FROM OPENQUERY(SVRNAME, ''' + REPLACE(@Sql, '''', '''''') + ''')'
EXEC(@Sql)
14
ответ дан 24 November 2019 в 10:10
поделиться

Со страницы MSDN :

OPENQUERY не принимает переменные в качестве аргументов

По сути, это означает, что вы не можете выполнить динамический запрос. Чтобы добиться того, что пытается сделать ваш образец, попробуйте следующее:

SELECT * FROM 
   OPENQUERY([NameOfLinkedSERVER], 'SELECT * FROM TABLENAME') T1 
   INNER JOIN 
   MYSQLSERVER.DATABASE.DBO.TABLENAME T2 ON T1.PK = T2.PK 
where
   T1.field1 = @someParameter

Очевидно, что если ваша таблица TABLENAME содержит большой объем данных, они также будут передаваться по сети, и производительность может быть низкой. С другой стороны, для небольшого количества данных это хорошо работает и позволяет избежать накладных расходов на динамическое построение sql (внедрение sql, экранирование кавычек), которые могут потребоваться для подхода exec .

12
ответ дан 24 November 2019 в 10:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: