miércoles, 2 de abril de 2025

Script para validar automáticamente todos los objetos (stored procedures y vistas) y determinar si es necesario recompilarlos

-- Script para validar automáticamente todos los objetos (stored procedures y vistas) y determinar si es necesario recompilarlos

-- Variable para almacenar el nombre de la base de datos
DECLARE @DatabaseName NVARCHAR(128);
SET @DatabaseName = DB_NAME(); -- Usa la base de datos actual

-- Tabla temporal para almacenar los resultados
CREATE TABLE #ObjectsToRecompile (
    ObjectName NVARCHAR(128),
    ObjectType NVARCHAR(128),
    RecompileNeeded BIT
);

-- Cursor para recorrer todos los objetos (stored procedures y vistas)
DECLARE ObjectCursor CURSOR FOR
SELECT name, type
FROM sys.objects
WHERE type IN ('P', 'V') -- 'P' para stored procedures, 'V' para vistas
AND is_ms_shipped = 0; -- Excluir objetos del sistema

DECLARE @ObjectName NVARCHAR(128);
DECLARE @ObjectType NVARCHAR(128);
DECLARE @CurrentDefinition NVARCHAR(MAX);
DECLARE @CompiledDefinition NVARCHAR(MAX);

OPEN ObjectCursor;
FETCH NEXT FROM ObjectCursor INTO @ObjectName, @ObjectType;

WHILE @@FETCH_STATUS = 0
BEGIN
    -- Obtener la definición actual del objeto
    SELECT @CurrentDefinition = OBJECT_DEFINITION(OBJECT_ID(@ObjectName));

    -- Obtener la definición compilada del objeto
    SELECT @CompiledDefinition = definition
    FROM sys.sql_modules
    WHERE object_id = OBJECT_ID(@ObjectName);

    -- Comparar las definiciones actual y compilada
    IF @CurrentDefinition = @CompiledDefinition
    BEGIN
        INSERT INTO #ObjectsToRecompile (ObjectName, ObjectType, RecompileNeeded)
        VALUES (@ObjectName, @ObjectType, 0); -- No es necesario recompilar
    END
    ELSE
    BEGIN
        INSERT INTO #ObjectsToRecompile (ObjectName, ObjectType, RecompileNeeded)
        VALUES (@ObjectName, @ObjectType, 1); -- Es necesario recompilar
    END

    FETCH NEXT FROM ObjectCursor INTO @ObjectName, @ObjectType;
END

CLOSE ObjectCursor;
DEALLOCATE ObjectCursor;

-- Mostrar los resultados
SELECT * FROM #ObjectsToRecompile
WHERE RecompileNeeded = 1;

-- Limpiar la tabla temporal
DROP TABLE #ObjectsToRecompile;

No hay comentarios:

Publicar un comentario