Из документации OPENQUERY говорится, что:
OPENQUERY не принимает переменные для своих аргументов.
См. Это article для обходного пути.
UPDATE:
Как было предложено, я в том числе рекомендации из статьи ниже.
Pass Основные ценности
Когда основной оператор 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 (@[email protected])
Используйте 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
Обойти это создать представление с OPENQUERY, а затем с помощью представления в соединении – Ismael