Динамический запрос SQL Server не может найти связанный сервер

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)


person Antares    schedule 24.12.2011    source источник
comment
Вы говорите, что ваш динамический SQL терпит неудачу, но выполнение статического SQL работает? Против одного и того же сервера/базы данных И с одного и того же сервера/базы данных? Выполнение sp_addlinkedserver '9044' в базе данных/сервере, на котором вы выполняете, должно решить проблему.   -  person UnhandledExcepSean    schedule 25.12.2011
comment
@Node относится к связанному серверу с именем 9044?   -  person rene    schedule 25.12.2011
comment
Что произойдет, если вы преобразуете @node в nvarchar?   -  person UnhandledExcepSean    schedule 25.12.2011
comment
Да, исправлено путем преобразования @node в nvarchar только что с использованием последней части (exec(@sql))   -  person Antares    schedule 26.12.2011


Ответы (2)


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

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

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;
person dotnetstep    schedule 25.12.2011
comment
Я обязательно попробую это. Спасибо - person Antares; 25.12.2011

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

MyServer = dev-sql-server.AdventureWorks etc 

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

person HoopSnake    schedule 24.12.2011
comment
Да, @node будет определяться циклом. - person Antares; 25.12.2011