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

别说谁变了你拦得住时间么 提交于 2019-12-04 00:13:09

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.

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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!