Jak policzyć rekordu z wielu tabel

0

Cześć znacie jakiś efektywny sposób policzenia wszystkich rekordów z wielu tabel powiedzmy że mamy pulę tabel T1 w skład której wchodzi 500 tabel i T2 w skład której też wchodzi 500 tabel. Jest jakiś sposób w sql że tworzysz jakąs listę tych tabel i zmienną iterujesz po tej liście, dla kazdej iteracji robiąc count ? wypisywać ręcznie te wszystkie tabelki to można się zakręcić Tabelki te są inne nie można ich połączyć kluczem

2

Wygenerować dynamiczny sql dla policzenia rekordów w każdej tabeli.

1

Jeśli to nie musi być Bardzo dokładne to użyj db partition stats

0

@UglyMan: O coś takiego miałem na myśli ale propozycja @Panczo też interesująca. @UglyMan definiuje jakąs liste tabel i w for robie selecta counta ?

2

Pewnie to zabije bazę, ale można sobie pocisnąć listę wszystkich tabelek np. w taki sposób:

SELECT count(*)
FROM(
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'TT')

I potem dla każdej tabeli robić coś ala count().

0

@UglyMan: znasz sposób aby te tabelki wrzucić w jakąś listę i po tej liście iterowac count?

1
printHello napisał(a):

@UglyMan: znasz sposób aby te tabelki wrzucić w jakąś listę i po tej liście iterowac count?

Możesz zrobić kursora po obiektach ze schematu: https://www.mssqltips.com/sqlservertip/1599/cursor-in-sql-server/

select * from sys.tables

I potem wygenerować dla każdej tabelki dynamicznego SQL z zapytaniem o ilości: https://stackoverflow.com/questions/55619754/what-is-the-sql-server-equivalent-of-execute-immediate-into-in-oracle

Jak potrzebujesz tylko policzyć rekordy w tabelach to jest taki sandardowy raport w SSMS który to robi:
screenshot-20211222110313.png

3

Policzenie dla wszystkich tabel:

DECLARE @tablename nvarchar(250);
DECLARE @RowsTotal BIGINT = 0;
DECLARE @RowsTable BIGINT = 0;
DECLARE @SQL AS NVARCHAR(500) 
DECLARE cTables CURSOR FAST_FORWARD FOR
SELECT  
	QUOTENAME(SCHEMA_NAME(sOBJ.schema_id))  + '.' + QUOTENAME(sOBJ.name) TableName
FROM 
	sys.objects AS sOBJ
WHERE
      sOBJ.type = 'U'
      AND sOBJ.is_ms_shipped = 0x0
 order by 1
OPEN cTables
FETCH NEXT FROM cTables INTO @tablename
WHILE @@FETCH_STATUS = 0
BEGIN
	SET @SQL = 'select @RowsTableOUT = count(*) from ' + @tablename
	EXEC sp_executesql @SQL,N'@RowsTableOUT int OUTPUT',@RowsTableOUT =@RowsTable OUTPUT
   --print @tablename + ' ' + cast(@RowsTable as varchar)
   set @RowsTotal = @RowsTotal + @RowsTable
   FETCH NEXT FROM cTables INTO @tablename

END
CLOSE cTables
DEALLOCATE cTables

Print @RowsTotal
GO

1 użytkowników online, w tym zalogowanych: 0, gości: 1