【问题标题】:SQL script to select information from the same table on each databases?SQL脚本从每个数据库的同一个表中选择信息?
【发布时间】:2020-09-28 20:22:43
【问题描述】:

我正在尝试弄清楚如何编写一个 SQL 脚本来从 Table1 中获取超过 10 个数据库的信息,我该怎么做呢? 换句话说,我有超过 10 个数据库,它们的表完全相同,名为 Table1,如何编写脚本而不重复我的代码?

SELECT name, dbo.tDBVersion FROM MASTER.dbo.sysdatabases WHERE NAME LIKE 'AAA%'

我尝试了上述方法,但问题是这个弹出窗口:“无法绑定多部分标识符 dbo.tDBVersion”

我想要的结果是 2 列:名称和数据库版本号。

编辑:我所有的数据库都以 AAA 开头

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    有一个名为sp_MSforeachdb 的存储过程。这将在每个数据库中运行相同的命令 - 例如:

    EXEC sp_MSforeachdb 'IF EXISTS(SELECT 1 FROM sys.tables WHERE name = ''tDBversion'')  SELECT db_name(), col1, col2 FROM tDBversion'
    

    https://www.mssqltips.com/sqlservertip/1414/run-same-command-on-all-sql-server-databases-without-cursors/

    【讨论】:

    • 我明白了,这让我成功了 50%,现在我只需要在我的结果旁边的列中显示被查询的数据库的名称,有没有办法做到这一点?
    • 更新答案 - 结合使用 db_name() 函数
    • 我正在尝试,但我得到'无效的对象名称'dbo.tDBversion'。 EXEC sp_MSforeachdb 'SELECT DB_NAME(), Version FROM dbo.tDBVersion'
    • 您的一个或多个数据库中不存在该表。您需要先更改命令检查表是否存在 - 请参阅更新的答案
    • 刚刚注意到发生了什么。我执行了 USE master,SP 只在 master db 上运行了 10 次。一旦我运行 USE AAA 数据库,我就没有错误,但我现在有 10 次相同的数据库,而不是 10 个不同的数据库
    【解决方案2】:

    我继续手动完成此操作,然后使用临时表并得到我想要的以下内容:

    USE AAA
    SELECT  DB_Name() 'Database', Version, CodeVersion INTO #TempTable FROM tDBVersion
    
    USE AAB
    INSERT INTO #TempTable 
    SELECT  DB_Name() 'Database', Version, CodeVersion FROM tDBVersion
    
    USE AAC
    INSERT INTO #TempTable 
    SELECT  DB_Name() 'Database', Version, CodeVersion FROM tDBVersion
    
    SELECT * FROM #TempTable
    -- ORDER BY "Version" asc
    DROP TABLE #TempTable
    
    -- My info sticks in the result pane while the table is dropped so that I don't forget to drop it
    

    【讨论】:

      猜你喜欢
      • 2020-03-10
      • 2018-05-04
      • 2017-11-04
      • 2013-03-08
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      相关资源
      最近更新 更多