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

- Rejestracja: dni
- Ostatnio: dni
- Postów: 3892
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