【问题标题】:query sql server in multiple database在多个数据库中查询sql server
【发布时间】:2022-01-07 09:14:41
【问题描述】:

我想在多个数据库上执行这个查询'select count(*) from Aircraft'。我们有 50 个数据库,所有这些数据库都有同一张表。我正在使用 sql server 2019。 我知道有可能循环这个查询,所以这就是我问你的原因。

我找到了一些旧的回复,但最近没有。

我使用了这个查询,但没有用


SELECT @Query = COALESCE(@Query + ' UNION ALL ', '') + 'select * from [' + TABLE_CATALOG+'].dbo.[Aircraft]'
FROM information_schema.tables 

SET @Query = STUFF(@Query, CHARINDEX('UNION ALL', @Query), 10, '')

PRINT @Query

EXEC(@Query)

【问题讨论】:

  • 我没有看到select count(*),我看到了select *,并且当您想要union all 时,它要求所有表Aircraft 具有相同的结构。
  • 另外返回的错误信息会有帮助
  • “...但它不起作用”无助于解决您的问题。

标签: sql sql-server database visual-studio tsql


【解决方案1】:

您可以通过利用 SQL Server 中未记录的存储过程来实现这一点,即sp_MSforeachdb

DECLARE @query NVARCHAR(1000)

SET @query = 
'USE ?
IF DB_NAME() NOT IN (''master'', ''tempdb'', ''model'', ''msdb'')
SELECT COUNT(*) AS Count FROM ?.dbo.fin_MemberAccount'

EXEC sp_MSforeachdb @command1 = @query

-- ? : this means the current db while iterating through db by stored procedure

【讨论】:

    【解决方案2】:

    如果所有目标数据库都位于一个实例中,则可以使用 string_agg 函数通过以下方式完成:

    Declare @schema_name sysname = N'dbo'
    Declare @table_name sysname = N'Aircraft'
    Declare @max nVarChar(max) = ''
    Declare @QueryText nVarChar(max)
    
    Select @QueryText = String_Agg(Concat(@max, N'Select * From ', 
                                                QuoteName([name]), N'.',
                                                QuoteName(@schema_name),N'.', 
                                                QuoteName(@table_name), Char(10)),
                                   Concat(N'UNION ALL',Char(10)))
    From master.dbo.sysdatabases 
    Where OBJECT_ID(Concat(QuoteName([name]),'.',
                           QuoteName(@schema_name),'.',
                           QuoteName(@table_name))) Is Not Null
    
    Print @QueryText
    
    Exec sp_executesql @QueryText
    

    【讨论】:

    • 它的工作非常感谢,但我只是收到这条消息:结束时间:2021-12-07T09:01:48.1282883+01:00。对不起,我不是专家。我不知道如何使用我创建的功能。你能帮帮我吗?
    • @gladiator06m 欢迎您。不幸的是,这对我来说是一个不清楚的信息。如果我能看看结果就更好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多