запрос sql server в нескольких базах данных

#sql #sql-server #database #visual-studio #tsql

#sql #sql-сервер #База данных #visual-studio #tsql

Вопрос:

я хотел бы выполнить этот запрос «выберите количество(*) из самолета» в нескольких базах данных. У нас есть 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)   

Комментарии:

1. Я не вижу а select count(*) , я вижу а select * , и для этого требуется, чтобы все таблицы Aircraft имели одинаковую структуру, когда вы хотите union all их использовать.

2. Возвращенное сообщение об ошибке было бы полезно, кроме того

3. «…но это не сработало » не поможет решить вашу проблему.

Ответ №1:

Если все целевые базы данных расположены в одном экземпляре, это можно сделать с помощью функции 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  

Комментарии:

1. это работа, большое спасибо, но у меня просто есть это сообщение : Время окончания : 2021-12-07T09:01:48.1282883 01:00. Извините, я не эксперт. Я не знаю, как использовать функцию, которую я создал. Вы не могли бы мне помочь?

2. @gladiator06m Добро пожаловать. К сожалению, для меня это неясное послание. Было бы лучше, если бы я мог взглянуть на результат.

Ответ №2:

Вы можете достичь этого, воспользовавшись недокументированной хранимой процедурой в 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