• SET NOCOUNT ON

    DECLARE @StatsToUpdate TABLE ( StatName NVARCHAR(MAX) )

    DECLARE @StatUpdating NVARCHAR(MAX)

    INSERT INTO @StatsToUpdate

    ( StatName

    )

    SELECT 'UPDATE STATISTICS dbo.' + OBJECT_NAME + ' ' + index_name

    FROM ( SELECT TOP 1

    OBJECT_NAME(A.object_id) AS Object_Name ,

    A.name AS index_name ,

    STATS_DATE(A.OBJECT_ID, index_id) AS StatsUpdated ,

    DATEDIFF(d, STATS_DATE(A.OBJECT_ID, index_id),

    GETDATE()) DaysOld

    FROM sys.indexes A

    INNER JOIN sys.tables B ON A.object_id = B.object_id

    WHERE A.name IS NOT NULL

    AND DATEDIFF(d, STATS_DATE(A.OBJECT_ID, index_id),

    GETDATE()) >= 0

    ) StatsThatAreTooOld

    WHILE ( SELECT COUNT(*)

    FROM @StatsToUpdate

    ) > 0

    BEGIN

    SET @StatUpdating = ( SELECT TOP 1

    statname

    FROM @StatsToUpdate

    )

    EXECUTE sp_executesql @StatUpdating

    PRINT 'Done ' + @StatUpdating

    DELETE FROM @StatsToUpdate

    WHERE StatName = @StatUpdating

    END

    Not the most elegant. Simply looks at the stats and in this case returns a list of stats more than 0 days old and then carrys out an update stats statement

    Would need a little tweaking to fully meet your needs probably and there are probably better ways to do this.