Categories:

The query generates a DROP statement for all auto-created statistics to all databases.

USE [Master];
GO

SET NOCOUNT ON;

CREATE TABLE #commands ([Database_Name] SYSNAME, Table_Name SYSNAME, Stats_Name SYSNAME, cmd NVARCHAR(4000), CONSTRAINT    PK_#commands
PRIMARY KEY CLUSTERED      ( [Database_Name], Table_Name, Stats_Name ) );

-- A cursor for all user databases
DECLARE Databases CURSOR
FOR
SELECT [name]
FROM   sys.databases
WHERE  database_id > 4 and state_desc = 'ONLINE'

DECLARE @Database_Name SYSNAME, @cmd NVARCHAR(4000);

OPEN Databases;

FETCH NEXT FROM Databases
INTO @Database_Name;

WHILE @@FETCH_STATUS = 0

BEGIN
-- Create statement
SET @cmd =    'SELECT       N''' + @Database_Name + ''',so.name,ss.name, N''DROP STATISTICS ['' + ssc.name +'']'' +''.['' + so.name +'']'' + ''.['' + ss.name + ''];''
FROM [' + @Database_Name + '].sys.stats AS ss
INNER JOIN [' + @Database_Name + '].sys.objects AS so ON ss.[object_id] = so.[object_id]
INNER JOIN [' + @Database_Name + '].sys.schemas AS ssc ON so.schema_id = ssc.schema_id
WHERE ss.auto_created = 1 AND so.is_ms_shipped = 0';

-- Execute and store in temp table
INSERT INTO #commands EXECUTE (@cmd);
FETCH NEXT FROM Databases INTO   @Database_Name;
END

;WITH Ordered_Cmd AS (
SELECT ROW_NUMBER() OVER ( PARTITION BY  Database_Name ORDER BY [Database_Name], Table_Name, Stats_Name) AS Row_Num, *
FROM   #commands
)
SELECT CASE WHEN   Row_Num = 1 THEN   REPLICATE(N'-',50) + NCHAR(10) + NCHAR(13) + N'USE [' + Database_Name + '];' + NCHAR(10) + NCHAR(13) ELSE '' END + cmd
FROM   Ordered_Cmd
ORDER BY [Database_Name], Table_Name, Stats_Name

-- CLEANUP
CLOSE Databases;
DEALLOCATE    Databases;
DROP TABLE    #commands;
[/code]

Tags:

Comments are closed