我在所有数据库中都有同名的表(3个DB')。
我有:
表:Table_test
数据库:
1. Test_DB
2. T_DB
3. Emp_DB
注意:表Table_test
存储在所有三个数据库中。
现在,我想从多个数据库中检索同名表中的记录 WHERE Database
名称以T
开头。
答案 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);
请让我知道我的努力。