引用列的统计信息可以防止删除该列



我正在尝试一个非常简单的drop column语句:

alter table MyTable drop column MyColumn

并在

的行中收到几个错误。

留言5074,16层,状态1,线路1
统计信息'_dta_stat_1268251623_3_2'依赖于列'MyColumn'。

后接

留言4922,16层,9州,1线

我不认为统计数据可以防止列被删除。他们吗?如果是这样,因为这些显然是自动创建的统计数据,我不能依赖于相同数据库的多个副本的名称相同,所以我如何在升级脚本中删除所有这些统计数据,以便在不同的数据库上执行?

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

我所见过的自动生成的统计数据要么具有它们所代表的索引的名称,要么以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是后台的游标,但其余的逻辑可以作为一个集合。

最新更新