Come in Oracle vi è una tabella che elenca tutte le tabelle del database (dba_tables) e possiamo usarlo per effettuare interventi di manutenzione in modo dinamico in SQL Server può fare la stessa query la tabella [database].dbo.sysobjects.
Nell'esempio riportato di seguito (come in altri che ho appeso) aggiornare le statistiche per tutte le tabelle di un database, SQL Server in modo dinamico interrogando il dizionario dei dati. Questo potrebbe essere incapsulati in una stored procedure o in un lavoro di eseguire direttamente i SQL Server Agent per tenere le statistiche aggiornate su tutte le tabelle di un database automaticamente.
-- Dichiarazione di variabili
DECLARE @dbName sysname
DECLARE @sample int
DECLARE @SQL nvarchar(4000)
DECLARE @ID int
DECLARE @Tabella sysname
DECLARE @RowCnt int
-- Filtro per database e la percentuale per il ricalcolo delle statistiche
SET @dbName = 'AdventureWorks2008'
SET @sample = 100
--Temporary Table
CREATE TABLE ## Tabelle
(
TabelleID INT IDENTITY(1, 1) NOT NULL,
TableName SYSNAME NOT NULL
)
--We feed the tabella con l'elenco di tabelle
SET @SQL = ''
SET @SQL = @SQL + 'INSERT INTO ##Tabelle (TableName) '
SET @SQL = @SQL + 'SELECT [name] FROM ' + @dbName + '.dbo.sysobjects WHERE xtype = ''U'' AND [name] <> ''dtproperties'''
EXEC sp_executesql @statement = @SQL
SELECT TOP 1 @ID = TableID, @Tabella = TableName
FROM ##Tabelle
ORDER BY TableID
SET @RowCnt = @@ROWCOUNT
-- Per ogni tabella
WHILE @RowCnt <> 0
BEGIN
SET @SQL = 'UPDATE STATISTICS ' + @dbname + '.dbo.[' + @Tabella + '] WITH SAMPLE ' + CONVERT(varchar(3), @sample) + ' PERCENT'
EXEC sp_executesql @statement = @SQL
SELECT TOP 1 @ID = TableID, @Tabella = TableName
FROM ##Tabelle
WHERE TableID > @ID
ORDER BY TableID
SET @RowCnt = @@ROWCOUNT
END
--Eliminare la tabella
DROP TABLE ##Tabelle