Доступ к другой базе данных с динамическим именем в SQL Server - PullRequest
4 голосов
/ 04 ноября 2008

В SQL Server 2005 есть две базы данных: одна называется "A", а другая - "A_2". «A» - это имя переменной, которую вводит пользователь, префикс «_2» для второй базы данных всегда известен. (Таким образом, базы данных могут быть «MyDB» и «MyDB_2» и т. Д.)

Как получить доступ к другой базе данных из хранимой процедуры, не зная фактического имени и не используя оператор 'exec'?

Ответы [ 3 ]

7 голосов
/ 04 ноября 2008

Вы можете попробовать использовать новую функцию SQL Server 2005, которая называется синонимами.

Вам потребуется CREATE SYNONYM , затем скомпилировать и сохранить хранимую процедуру, используя синоним. Это даст вам возможность изменить синоним «на лету» позже. Очевидно, что все равно необходимо будет выполнить код CREATE SYNONYM как динамический SQL.

Для запуска CREATE SYNONYM пользователю необходимо предоставить соответствующее разрешение или разрешение ALTER SCHEMA. Обязательно прочитайте больше о синонимах, прежде чем идти по этому пути, есть несколько прикрепленных строк.

0 голосов
/ 21 июня 2009

Что я сделал, так это создал представление для каждой таблицы, к которой я хотел получить доступ (предположительно, схемы одинаковы), а затем мой последующий код просто ссылался на представление (я). Например

if object_id('view_Table1') is not null
    drop view view_Table1

dim @cmd nvarchar(max)

set @cmd = 'create view view_Table1 as select * from ' + @DbName + '.dbo.Table1'

exec sp_executesql @cmd

select WhateverColumn from view_Table1
0 голосов
/ 04 ноября 2008

Не думаю, что это возможно.

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

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

Какова цель всего этого? Что произойдет, если вы назовете свои базы данных в своей логике, но где-то сохраните связь между вашей логикой и именем, введенным пользователем?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...