sp_droptablecolstatistics.sql 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. CREATE PROCEDURE Usp_droptablecolstatistics(@TableName  SYSNAME,
  2.                                             @ColumnName SYSNAME = NULL)
  3. AS
  4.   BEGIN
  5.       SET nocount ON
  6.       DECLARE @Sql NVARCHAR(max)
  7.       DECLARE @StatsName SYSNAME
  8.       DECLARE @Error INT
  9.       IF ( @TableName IS NULL
  10.             OR Object_id(@TableName) IS NULL )
  11.         PRINT 'Table name doesnt exist in the database'
  12.       ELSE IF ( @ColumnName IS NOT NULL )
  13.          AND (SELECT NAME
  14.               FROM   sys.columns
  15.               WHERE  object_id = Object_id(@Tablename)
  16.                      AND NAME = @ColumnName) IS NULL
  17.         PRINT 'Column name doesnt exist in the table '
  18.               + @TableName
  19.       IF @ColumnName IS NULL
  20.         BEGIN
  21.             DECLARE cur CURSOR local FOR
  22.               SELECT @TableName AS 'TableName',
  23.                      s.NAME     AS 'StatsName'
  24.               FROM   sys.stats s
  25.                      JOIN sys.tables t
  26.                        ON s.object_id = t.object_id
  27.               WHERE  s.object_id > 100
  28.                      AND t.object_id = Object_id(@TableName)
  29.         END
  30.       ELSE
  31.         BEGIN
  32.             DECLARE cur CURSOR local FOR
  33.               SELECT @TableName AS 'TableName',
  34.                      s.NAME     AS 'StatsName'
  35.               FROM   sys.stats s
  36.                      INNER JOIN sys.stats_columns AS sc
  37.                              ON s.object_id = sc.object_id
  38.                                 AND s.stats_id = sc.stats_id
  39.                      INNER JOIN sys.columns AS c
  40.                              ON sc.object_id = c.object_id
  41.                                 AND c.column_id = sc.column_id
  42.               WHERE  s.object_id > 100
  43.                      AND s.object_id = Object_id(@TableName)
  44.                      AND c.NAME = @ColumnName
  45.         END
  46.       OPEN cur
  47.       FETCH next FROM cur INTO @TableName, @StatsName
  48.       WHILE @@FETCH_STATUS = 0
  49.         BEGIN
  50.             SET @Sql = 'DROP STATISTICS ' + @TableName + '.'
  51.                        + Quotename(@StatsName)
  52.             BEGIN try
  53.                 EXEC Sp_executesql @Sql
  54.                 PRINT 'Executed ' + @Sql + '..'
  55.             END try
  56.             BEGIN catch
  57.                 SELECT @ERROR = Error_number()
  58.                 IF @ERROR = 3739
  59.                   BEGIN try
  60.                       SET @Sql = 'DROP INDEX ' + @TableName + '.' + Quotename(@StatsName)
  61.                       EXEC Sp_executesql @Sql
  62.                       PRINT 'Executed ' + @Sql + '..'
  63.                   END try
  64.                 BEGIN catch
  65.                     SELECT @ERROR = Error_number()
  66.                     IF @Error = 3723
  67.                       SET @Sql = 'ALTER TABLE ' + @TableName + ' drop constraint ' + Quotename(@StatsName)
  68.                     PRINT 'Executing ' + @Sql + '..'
  69.                     EXEC Sp_executesql @Sql
  70.                 END catch
  71.             END catch
  72.             FETCH next FROM cur INTO @TableName, @StatsName
  73.         END
  74.       CLOSE cur
  75.       DEALLOCATE cur
  76.   END