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.