Динамическое указание имен связанных серверов и баз данных в хранимой процедуре

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

Как это сделать, не используя ни exec, ни sp_executesql?

Я использую SQL Server 2008.

Спасибо.

ОБНОВЛЕНИЕ

Я нашел несколько ссылок

http://www.eggheadcafe.com/software/aspnet/29397800/dynamically-specify-serve.aspx

http://www.sommarskog.se/dynamic_sql.html

Возможно ли использование SYNONYM? Если да, то как?

ОБНОВЛЕНИЕ 2

Я забыл упомянуть, что все эти серверы связаны с сервером, на котором хранится хранимая процедура.

ОБНОВЛЕНИЕ 3

OPENROWSET или OPENDATASOURCE также недоступны. Мне нужно решение без создания строки запроса, объединяющей имя сервера, имя схемы, имя базы данных.

Конечно, это можно сделать, используя if или case в хранимой процедуре, но если у нас есть 37 вариантов, то это не очень хорошее решение.

Любые другие предложения?


person hgulyan    schedule 09.06.2010    source источник
comment
Сколько у вас комбинаций сервера и базы данных, для которых вы хотите динамически выполнять sql? пример: db1.sp1, db1.sp2, db2.sp1, db2.sp2, db2.sp3?   -  person shahkalpeshp    schedule 09.06.2010
comment
37, вы предлагаете использовать case или if?   -  person hgulyan    schedule 09.06.2010
comment
SYNONYM на самом деле не поможет, так как вам все равно нужно будет изменить то, на что указывает синоним, для чего потребуется либо динамический SQL, либо большой жестко закодированный условный оператор. Также может вызвать проблемы с параллелизмом, поскольку синоним может указывать только на одну вещь за раз.   -  person Martin Smith    schedule 09.06.2010
comment
@Martin Smith, спасибо за описание синонима :)   -  person hgulyan    schedule 09.06.2010


Ответы (2)


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

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

person hgulyan    schedule 11.06.2010

OPENROWSET или OPENDATASOURCE помочь?

РЕДАКТИРОВАТЬ: если это работает, вы можете изменить базу данных во время выполнения и выполнить запрос, используя текущее соединение. Я не вижу другого способа выполнить запрос так, как вы хотите.

Что не так с запуском запроса с использованием строки, т.е. динамического запроса?

person shahkalpeshp    schedule 09.06.2010
comment
Это связанные серверы, поэтому у меня нет проблем с подключением к ним. OPENROWSET или OPENDATASOURCE не решают мою проблему, я просто не хочу помещать свой запрос в строковый тип. - person hgulyan; 09.06.2010
comment
@hgulyan Но они берут строку, которую вы можете легко построить путем конкатенации. - person Martin Smith; 09.06.2010
comment
@Martin Smith, я бы сделал это с параметризованным sp_executesql, если бы я хотел построить свою строку запроса. - person hgulyan; 09.06.2010
comment
@shahkalpesh, я отредактировал свои вопросы. Видите ли, причина, по которой я не хочу использовать exec или sp_executesql, заключается в том, что я не хочу генерировать объединение строк запроса, как я сказал в обновлении 3. - person hgulyan; 09.06.2010
comment
@hgulyan Ну, тогда это невозможно без огромного набора операторов if. - person Martin Smith; 09.06.2010
comment
@ Мартин Смит, тогда напиши это как ответ, и я приму его. Я считаю, что должен использовать sp_executesql. - person hgulyan; 09.06.2010
comment
@hgulyan - Оставьте вопрос немного открытым, если у кого-то есть представление о том, как этого можно достичь. Я определенно не могу думать ни о каком пути, хотя! - person Martin Smith; 09.06.2010
comment
@Martin Smith, я тоже не могу найти другого решения :( ps все равно опубликуйте свой ответ. Я подожду немного и приму ваш ответ. - person hgulyan; 09.06.2010
comment
@hgulyan Ответ gbn здесь вообще помогает или он не применим к тому, что вы делаете? stackoverflow .com/questions/2073544/ - person Martin Smith; 09.06.2010
comment
Я не понял, как это работает. Где я должен добавить свой запрос и что @p1, @p2? - person hgulyan; 09.06.2010