Связаны ли статистические данные с столбцом, чтобы этот столбец не был удален?

Я пробую очень простой оператор drop column:

alter table MyTable drop column MyColumn

и получая несколько ошибок вдоль строк

Msg 5074, уровень 16, состояние 1, строка 1
Статистика "_dta_stat_1268251623_3_2" зависит от столбца "MyColumn".

последовал в конечном счете

Msg 4922, уровень 16, состояние 9, строка 1
ALTER TABLE DROP COLUMN MyColumn не удалось, так как один или несколько объектов попадают в этот столбец.

Я не думал, что статистика предотвращает падение столбца. Они? Если это так, так как это, по-видимому, автоматически созданная статистика, я не могу зависеть от того, что имена одинаковы для нескольких копий одной и той же базы данных, поэтому как я могу удалить все такие статистики в обновлении script для выполнения на другом базы данных?

Ответ 1

Автогенерированная статистика, которую я видел, либо имеет имя индекса, который они представляют, либо начинается с чего-то вроде WA_Sys_.

Вы на 100% уверены, что это не набор пользовательских настроек, настроенных кем-то?

Проверьте это:

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

... и посмотрите, что указывает поле user_created.

За комментарий:

Это не проверено, но вы можете попробовать что-то вроде:

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'

Измените PRINT на EXEC, если он выглядит хорошо.

sp_msforeachdb - это курсор в фоновом режиме, но остальная часть логики вы можете выполнять как набор.

Ответ 2

Код, предложенный в ответе JNK, не работает, но идея хорошая. Если вы хотите удалить все созданные пользователем статистические данные, это мое протестированное решение:

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