Al igual que en Oracle existe una tabla donde se listan todas las tablas de la base de datos (dba_tables) y podemos usarla para realizar operaciones de mantenimiento de forma dinámica, en Sql Server podemos hacer lo mismo consultando la tabla [basededatos].dbo.sysobjects.
En el ejemplo inferior (como en otros que he colgado) actualizo las estadísticas de todas las tablas de una base de datos de Sql Server de forma dinámica consultando el diccionario de datos. Este se podría encapsular en un stored procedure o directamente ejecutarlo en un job del Agente de Sql Server para mantener actualizadas las estadísticas de todas las tablas de una base de datos de forma automática.
-- Declaración de variables DECLARE @dbName sysname DECLARE @sample int DECLARE @SQL nvarchar(4000) DECLARE @ID int DECLARE @Tabla sysname DECLARE @RowCnt int --Filtro por base de datos y porcentaje para recalculo de estadísticas SET @dbName = 'AdventureWorks2008' SET @sample = 100 --Tabla temporal CREATE TABLE ##Tablas ( TableID INT IDENTITY(1, 1) NOT NULL, TableName SYSNAME NOT NULL ) --Alimentamos la tabla con la lista de tablas SET @SQL = '' SET @SQL = @SQL + 'INSERT INTO ##Tablas (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, @Tabla = TableName FROM ##Tablas ORDER BY TableID SET @RowCnt = @@ROWCOUNT --Por cada tabla WHILE @RowCnt <> 0 BEGIN SET @SQL = 'UPDATE STATISTICS ' + @dbname + '.dbo.[' + @Tabla + '] WITH SAMPLE ' + CONVERT(varchar(3), @sample) + ' PERCENT' EXEC sp_executesql @statement = @SQL SELECT TOP 1 @ID = TableID, @Tabla = TableName FROM ##Tablas WHERE TableID > @ID ORDER BY TableID SET @RowCnt = @@ROWCOUNT END --Eliminamos la tabla DROP TABLE ##Tablas
La forma de proceder arriba
Subido por il_masacratore el 8 Marzo, 2010 - 11:49
La forma de proceder arriba indicada dará problemas para tablas que no esten contenidas en el esquema dbo. Por ello para solventar este problema primero debemos cambiar la forma de alimentar la tabla temporal para usar el siguiente bloque SQL: