【问题标题】:Retrieve data from same table in all server databases从所有服务器数据库中的同一个表中检索数据
【发布时间】:2017-01-18 19:10:08
【问题描述】:

我有 SQL Server 2012 和 DB1 、 DB2 、 Db3 ...> DB50

如果我需要查看我使用的服务器中的数据库

SELECT * FROM sys.databases   

所有数据库都有同一个表Saves,除了五个没有这个表的数据库。

我需要知道哪些数据库有表 Saves - 为此我使用

sp_msforeachdb "SELECT '?' DatabaseName, Name FROM ?.sys.Tables WHERE Name LIKE '%saves%'"

如果找到,我如何从所有数据库中的表Saves 中检索数据?

我是一一使用的,保存数据之类的需要很多时间

select * from db1.dbo.Saves

并保存数据然后返回搜索

select * from db2.dbo.Saves

保存数据然后返回搜索

select * from db3.dbo.Saves

我需要一个类似的 SQL 命令:

Select * from Saves in  sys.databases  if found

【问题讨论】:

    标签: sql-server database data-retrieval multi-database


    【解决方案1】:

    您可以使用以下查询来获取结果。

    EXEC sp_msforeachdb '
    USE [?];
    IF EXISTS (SELECT * FROM [?].INFORMATION_SCHEMA.TABLES AS T WHERE T.TABLE_NAME=''Saves'')
    BEGIN
    DECLARE @QUERY VARCHAR(MAX);
    SELECT @QUERY = COALESCE(@QUERY+'';
    SELECT ''''?'''' AS DBNAME; SELECT ''''?'''' AS DBNAME,* FROM [''+T.TABLE_CATALOG+''].''+''[''+T.TABLE_SCHEMA+'']''+''.[''+T.TABLE_NAME+'']'',''
    SELECT ''''?'''' AS DBNAME;
    SELECT ''''?'''' AS DBNAME,* FROM [''+T.TABLE_CATALOG+''].''+''[''+T.TABLE_SCHEMA+'']''+''.[''+T.TABLE_NAME+'']'')
    FROM [?].INFORMATION_SCHEMA.TABLES T WHERE T.TABLE_NAME = ''Saves''
    EXEC (@QUERY);
    END
    ';

    `

    【讨论】:

    • 非常感谢它运行良好并显示数据库的名称,再次感谢他的表
    • 在 MSSQL 管理中工作正常,但在从网站页面使用时,我将其设计为运行 sql 命令与其他命令一起工作,但不是此代码
    • (仅从结果中检索第一行)在 web 执行中
    【解决方案2】:

    享受...

    DECLARE @name  VARCHAR(50), -- database name  
            @Query  NVARCHAR(500) -- My Query
    
    DECLARE db_cursor CURSOR FOR  
    SELECT name 
    FROM MASTER.dbo.sysdatabases 
    WHERE name NOT IN ('master','model','msdb','tempdb')  
    
    OPEN db_cursor   
    FETCH NEXT FROM db_cursor INTO @name   
    
    WHILE @@FETCH_STATUS = 0   
    BEGIN 
    set @Query ='USE  '+@name+' 
                Go 
                if OBJECT_ID(''['+@name+'].[dbo].[saves]'') is not null
                begin
                    select * from ['+@name+'].[dbo].[saves]
                end
                else
                begin
                    select ''table saves does not exist into database: '+@name+''' 
                end'
    
    /* the next line for resloving error : Incorrect syntax near 'Go'*/
    SET @Query = 'EXEC (''' + REPLACE(REPLACE(@Query, '''', ''''''), 'GO', ''');     EXEC(''') + ''');'--Just add this one line.
    
    exec sp_executesql @Query
    
    FETCH NEXT FROM db_cursor INTO @name   
    END   
    
    CLOSE db_cursor   
    DEALLOCATE db_cursor  
    

    【讨论】:

    • 非常感谢它工作正常,但没有显示什么数据库名称
    • 可以为从 MSSQL 管理中找到并正常工作的数据库添加名称,但是当从网站页面使用时,我将其设计为运行 sql 命令与其他命令一起工作,但不是此代码
    • (仅从结果中检索第一行)在 web 执行中
    猜你喜欢
    • 2016-07-19
    • 2016-06-27
    • 2019-03-13
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多