【问题标题】:SQL Server 2008 - Same query, same server instance, multiple databases with same tablesSQL Server 2008 - 相同的查询、相同的服务器实例、具有相同表的多个数据库
【发布时间】:2014-07-26 17:03:06
【问题描述】:

我有 1 个带有多个相同数据库的 SQL Server 2008 实例。 我希望在所有数据库上运行相同的查询(例如:向表中添加列)。 我希望使用包含数据库名称的数组。

如何在 SQL Server 中执行此操作?

感谢您的帮助

【问题讨论】:

    标签: sql-server sql-server-2008


    【解决方案1】:

    您可以使用语法 [dbname].[schema].[tablename] 跨多个数据库运行 SQL

    因此您可以轻松编写动态 SQL 到 INSERT INTO [dbname].[dbo].[TableName] 任何您想要的。

    您甚至可以编写一个 SQL 查询,使用这种语法连接来自两个不同数据库的表。

    在您的情况下,只需在字符串中构建 SQL 语句,然后调用 EXEC 来执行它。您可以在顶部声明一个表变量并将数据库的名称插入其中,然后在 SQL 查询中使用它来构建 SQL 字符串。或者使用适当的 WHERE 子句查询 sys.databases 以获取数据库名称。然后使用这些值为每个数据库构建和执行适当的 SQL。

    【讨论】:

    • 感谢您的回答。你能推荐一本书/网站来学习正确的语法吗?
    【解决方案2】:

    EXEC sp_MSforeachdb @command

    它没有记录,该命令将需要检查它正在处​​理哪个数据库以排除您不想要的数据库

    【讨论】:

      【解决方案3】:

      您可以通过查询 sys.databases 来获取所有数据库,然后在游标上使用动态 sql 语句,其中 select 语句由当前值(即数据库名称)适当限定。

      这是一个示例脚本,它将输出名称以“commerce”结尾的数据库的结果。修改它以插入临时表而不是选择将是微不足道的

      DECLARE DBS CURSOR FOR
          SELECT name
          FROM sys.databases 
          WHERE name like '%Commerce'
      
      DECLARE @DB SYSNAME
      
      OPEN DBS
      
      FETCH NEXT FROM DBS INTO @DB
      
      WHILE @@FETCH_STATUS = 0
      BEGIN
          DECLARE @SQL NVARCHAR(MAX)
          SET @SQL = 'SELECT TOP 1 DB_NAME(), * FROM ' + @DB + '.dbo.dbversion ORDER BY ExecutionDate desc'
          exec(  @sql )
      
          FETCH NEXT FROM DBS INTO @DB
      END
      
      CLOSE  DBS
      DEALLOCATE DBS 
      

      【讨论】:

      • 感谢您的帮助。如何在“WHERE name like '%Commerce'”部分添加我的数据库名称?
      • 光标只是一个简单的选择语句,因此您可以使用简单的逗号分隔列表,其中名称在 ('a', 'b', 'c')
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多