использовать вывод оператора SQL в качестве таблицы для выполнения запроса - PullRequest
1 голос
/ 09 сентября 2011

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

У меня есть таблица в базе данных DB1 (скажем, DB1.dbo.table1, на сервере MS SQL), которая содержит имена других баз данных на сервере (DB2, DB3 и т. Д.). Теперь все базы данных, перечисленные в этой таблице, содержат определенную таблицу (давайте назовем ее требуемой таблицей), к которой я хочу обратиться. Итак, я ищу способ создания хранимой процедуры / скрипта / чего бы то ни было, который запрашивает DB1.dbotable1 для других БД, а затем запускает инструкцию для каждого из полученных dbs, что-то вроде:

@DBNAME = select dbName from DB1.dbo.table1

select value1 from @DBNAME.dbo.desiredTable 

Это возможно? Я планирую запустить скрипт sp / в разных системах DB1.dbo.table1, являющийся константой.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2011

Вам необходимо построить запрос динамически, а затем выполнить его. Примерно так:

DECLARE @MyDynamicQuery VARCHAR(MAX)
DECLARE @MyDynamicDBName VARCHAR(20)

SELECT @MyDynamicDBName = dbName 
FROM DB1.dbo.table1

SET @MyDynamicQuery = 'SELECT value1 FROM ' + @MyDynamicDBName + '.dbo.desiredTable'

EXEC(@MyDynamicQuery)
0 голосов
/ 09 сентября 2011

Вы можете использовать недокументированную хранимую процедуру, sp_MSForEachDB.Однако применяются обычные предупреждения об использовании недокументированной хранимой процедуры.Вот пример того, как вы можете использовать его в вашем случае:

EXEC sp_MSForEachDB 'SELECT value1 FROM ?.dbo.desiredTable'

Обратите внимание на использование ? вместо имени БД.

Я не уверен, как бы вы это сделалиограничить его только БД в вашей собственной таблице.Если я что-нибудь придумаю, то выложу здесь.

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