Как использовать переменную временной таблицы (например, @temp) для хранения результата sp_msforeachdb - PullRequest
2 голосов
/ 07 июля 2010

Я в основном пытаюсь выяснить все таблицы всех баз данных, присутствующих в СЕРВЕРЕ SQL, используя sp_msforeachdb.

Если я напишу exec sp_msforeachdb 'select "?" AS DatabaseNames,* from [?].sys.tables'

Я получу результат хорошо, но для каждой базы данных будет создан отдельный набор записей.

Теперь, если я использую

CREATE TABLE #DBINFO
(
            DbName NVARCHAR(255)
            ,ObjectID NVARCHAR(255)
)

INSERT INTO #DBINFO
exec sp_msforeachdb 'select "?" AS DatabaseNames,ObjectID  from [?].sys.tables'

SELECT * FROM #DBINFO

Это отлично работает.

Однако, если я сделаю

Declare @DBINFO Table(DbName NVARCHAR(255),ObjectID NVARCHAR(255))
INSERT INTO @DBINFO
    exec sp_msforeachdb 'select "?" AS DatabaseNames,ObjectID  from [?].sys.tables'

    SELECT * FROM @DBINFO

Не принимает

Более того, если я сделаю

;With CTE AS
(
  exec sp_msforeachdb 'select "?" AS DatabaseNames,* from [?].sys.tables'
)

Select * from CTE

, выдает ошибку (В настоящее время я не помню этого).

Вопрос

1) Можно ли сделать то же самое, используя переменную таблицы

2) Можно ли сделать то же самое с помощью CTE?

SQL SERVER 2005.

Спасибо

1 Ответ

4 голосов
/ 07 июля 2010

1) Да, вам просто нужно использовать правильные имена для ваших столбцов (object_id, а не ObjectID):

Declare @DBINFO Table(DbName NVARCHAR(255),ObjectID NVARCHAR(255)) 
INSERT INTO @DBINFO 
exec sp_msforeachdb 'select "?" AS DatabaseNames,object_id  from [?].sys.tables' 
SELECT * FROM @DBINFO 

2) Нет

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