Динамический запрос SQL Server - не удается найти связанный сервер - PullRequest
0 голосов
/ 25 декабря 2011
declare @node int = 9044;

DECLARE @sqlCommand NVARCHAR(MAX) = 
(
    'SELECT * FROM [@node].[database_name].dbo.table_name'
);

DECLARE @paramList NVARCHAR(400) =
(
    '@node int'
)

exec sp_executesql @sqlCommand, @paramlist, @node;

Итак, это простой запрос, который я пытаюсь выполнить. 9044 в порядке. Выполнение этого запроса обычно работает отлично (очевидно, я удалил имена БД и таблицы). Не совсем уверен, что с ним не так. Я получаю ошибку:

Сообщение 7202, Уровень 11, Состояние 2, Строка 1 Не удалось найти сервер '@node' в sys.servers. Убедитесь, что указано правильное имя сервера. При необходимости выполните хранимую процедуру sp_addlinkedserver, чтобы добавить сервер в sys.servers.

Любые идеи о том, как решить эту проблему, или я должен просто написать запрос и использовать EXEC (@sql)

Ответы [ 2 ]

1 голос
/ 25 декабря 2011

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

Попробуйте так.

declare @node int = 9044;

DECLARE @sqlCommand NVARCHAR(MAX) = 
(
    'SELECT * FROM [@node].[database_name].dbo.table_name'
);

DECLARE @paramList NVARCHAR(400) =
(
    '@node int'
)


SET @sqlCommand  = REPLACE(@sqlCommand , '@node',@node)
exec sp_executesql @sqlCommand, @paramlist, @node;
0 голосов
/ 25 декабря 2011

Вы используете трехточечную нотацию, которая определяет, что server.db.table @nodes ищет сервер с таким именем ... вы ищете это имя сервера динамически ... лучший способ - создать связанный объект сервераили псевдоним и сослаться на него это было то есть

MyServer = dev-sql-server.AdventureWorks etc 

Или вам просто нужно избавиться от лишнего [@node].

...