#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