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
Wygenerować dynamiczny sql dla policzenia rekordów w każdej tabeli.
Jeśli to nie musi być Bardzo dokładne to użyj db partition stats
@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 ?
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()
.
@UglyMan: znasz sposób aby te tabelki wrzucić w jakąś listę i po tej liście iterowac count?
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:
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