запросить несколько баз данных для статистических целей SQL - PullRequest
1 голос
/ 19 июля 2010

Я пытаюсь написать хранимую процедуру, которая позволит мне написать один оператор SELECT, который выполняется во всех базах данных на моем SQL Server. (Microsoft SQL 2005)

до сих пор я придумал следующую процедуру

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [sp_cross_db_query]
@SQLQuery varchar(400)
AS

DECLARE @DB_Name varchar(100)
DECLARE database_cursor CURSOR FOR 

SELECT DatabaseName 
FROM Management.dbo.Customers

OPEN database_cursor

FETCH NEXT FROM database_cursor INTO @DB_Name

WHILE @@FETCH_STATUS = 0 
BEGIN 
    exec(
        'USE [' + @DB_Name + '];' +
        @SQLQuery
        )
       FETCH NEXT FROM database_cursor INTO @DB_Name 
END
CLOSE database_cursor 
DEALLOCATE database_cursor

для запуска запроса

  exec sp_cross_db_query 'SELECT count(*) FROM Products'

по этому я могу сосчитать все продукты по всем базам данных, проблема в том, как мне вернуть мои данные. теперь я получаю несколько «окон», в которых хранится результат, который совершенно неуправляем. поэтому мой вопрос, как я могу получить результат очень похож на SELECT .., UNION SELECT .., UNION SELECT ..? (другими словами, одна таблица результатов)?

У меня были мысли о создании временной таблицы внутри процедуры, как вы думаете?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 19 июля 2010

Я думаю, что нет другого пути, кроме временной таблицы, для достижения желаемой функциональности. Вам необходимо добавить строку во временную таблицу, а затем использовать select @tablevariable для получения всех данных.

Проверьте это: http://www.sqlteam.com/article/introduction-to-dynamic-sql-part-2

1 голос
/ 19 июля 2010

Возможно динамический SQL

DECLARE @DynSQL nvarchar(max)

select 
@DynSQL = isnull(@DynSQL + ' UNION ALL ','') + 
'SELECT count(*) AS ProdCnt  FROM ' + quotename(name) + '..Products'
 from sys.databases
 WHERE state= 0 AND is_in_standby=0 AND database_id>4 /*Exclude Offline and System 
                                                        databases*/

PRINT @DynSQL /*For Debugging or use the next line if the print output is truncated*/
SELECT @DynSQL AS [processing-instruction(x)] FOR XML PATH('')

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