从单个结果集中的多个数据库中检索同名表中的记录

时间:2015-11-23 05:55:53

标签: sql sql-server sql-server-2008-r2

我在所有数据库中都有同名的表(3个DB')。

我有:

Table_test

数据库
1. Test_DB
2. T_DB
3. Emp_DB

注意:表Table_test存储在所有三个数据库中。

现在,我想从多个数据库中检索同名表中的记录 WHERE Database名称以T开头。

2 个答案:

答案 0 :(得分:2)

declare @list_DB varchar(100), @sql varchar(1000)
select @list_DB = stuff((select ',' + name
               from (select distinct DB_NAME(database_id) as name
                    from [sys].[dm_db_index_operational_stats](NULL,NULL,NULL,NULL)
                    where OBJECT_NAME(object_id,database_id) = 'Table_test'
                        and DB_NAME(database_id) like 'T%') as A
               for xml path('')), 1, 1, '') + ','
declare @start int, @word nvarchar(4000), @charindex int, @i int
set @i=1
set @start=1
set @charindex= charindex(',', @list_DB, @start)
set @sql = ''
select @list_DB
while (@charindex <> 0)begin
    set @word= substring(@list_DB, @start, @charindex - @start)
    set @start= @charindex +1
    set @charindex= charindex(',', @list_DB, @start)
    set @sql = @sql + 'SELECT * FROM ' + @word + '.dbo.Table_test UNION ALL'
    set @i=@i+1
end

if @sql <> ''
    set @sql = SUBSTRING(@sql, 1, len(@sql) - 10)
exec(@sql)

答案 1 :(得分:0)

我的尝试:

首先,我创建了名为Dbs的表,其中包含将由系统存储过程sp_databases提供的所有数据库详细信息。

Dbs

CREATE TABLE Dbs
(
Database_Name VARCHAR(250),
Database_Size INT,
Remark VARCHAR(100)
);

插入:从执行系统存储过程sp_databases插入数据。

INSERT INTO Dbs exec sys.sp_databases;

脚本:以下脚本准备了select语句。

DECLARE @InnerQuery VARCHAR(MAX) = ''
DECLARE @DB VARCHAR(100)
DECLARE Cur1 CURSOR
FAST_FORWARD FOR SELECT Database_Name FROM Dbs
WHERE Database_Name LIKE 'T%' AND Database_Name != 'tempDB'

OPEN Cur1 
FETCH NEXT FROM Cur1 INTO @DB
WHILE(@@FETCH_STATUS=0)
BEGIN

    SET @InnerQuery += 'SELECT * FROM '+@DB+'..Table_Test UNION ALL '
    PRINT('1');

    FETCH NEXT FROM Cur1 INTO @DB;

END
CLOSE Cur1;
DEALLOCATE Cur1;

IF @InnerQuery <> ''
BEGIN
    SET @InnerQuery = LEFT(@InnerQuery,LEN(@InnerQuery)-10)
END

PRINT(@InnerQuery);

EXECUTE(@InnerQuery);

请让我知道我的努力。