Do statistics referencing a column prevent that column from being dropped?

前端 未结 2 1614
小蘑菇
小蘑菇 2021-02-19 08:11

I\'m trying a very simple drop column statement:

alter table MyTable drop column MyColumn

and receiving several errors along the l

相关标签:
2条回答
  • 2021-02-19 09:03

    Auto-generated statistics that I have seen all either have the name of the index they represent OR start with something like WA_Sys_.

    Are you 100% sure this is not a set of custom stats someone set up?

    Check this:

    select *
    FROM sys.stats WHERE name = '_dta_stat_1268251623_3_2'
    

    ...and see what the user_created field indicates.

    Per comment:

    This is untested but you could try something like:

    exec sp_MSforeachdb '
    use ?
    
    DECLARE @SQL varchar(max) = ''''
    
    select @SQL = @SQL + ''DROP STATISTICS '' + OBJECT_NAME(c.object_id) + ''.'' + s.name + CHAR(10) + CHAR(13)
    from sys.stats s
    INNER JOIN sys.stats_columns sc
    ON sc.stats_id = s.stats_id
    INNER JOIN sys.columns c
    ON c.column_id = sc.column_id
    WHERE c.name = ''ClaimNbr''
    --and s.user_created = 1
    
    PRINT @SQL'
    

    Change the PRINT to an EXEC if it looks good.

    sp_msforeachdb is a cursor in the background but the rest of the logic you can do as a set.

    0 讨论(0)
  • 2021-02-19 09:08

    The code proposed in JNK answer does not work, but the idea is good. If you want to delete all user created statistics this my tested solution :

    DECLARE @sql NVARCHAR(MAX)
    
    DECLARE statCursor CURSOR FOR 
    SELECT 
        'DROP STATISTICS ' + QUOTENAME(SCHEMA_NAME(t.schema_id)) 
                            + '.' + QUOTENAME(t.name) 
                            + '.' + QUOTENAME(st.name) AS sql
    FROM
        sys.stats AS st 
        INNER JOIN sys.tables AS t
            ON st.object_id = t.object_id
    WHERE
        st.user_created = 1
    ORDER BY 1;
    
    OPEN statCursor;
    
    FETCH NEXT FROM statCursor INTO @sql
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
        PRINT @sql
        EXEC sp_executesql @sql
        FETCH NEXT FROM statCursor INTO @sql
    END  
    CLOSE statCursor  
    DEALLOCATE statCursor
    
    0 讨论(0)
提交回复
热议问题