【问题标题】:Unable to Increase Column size无法增加列大小
【发布时间】:2012-08-06 12:00:04
【问题描述】:

我需要增加表的列大小,我正在使用下面的查询来增加大小,但我得到了以下错误

Alter Table Tabl1 Alter Column Col1 VarChar(6) Not NULL

消息 5074,第 16 级,状态 1,第 1 行
对象“Tabl1”依赖于“Col1”列。
消息 5074,第 16 级,状态 1,第 1 行
统计信息“_WA_Sys_Col1_5070F446”取决于列“Col1”。
消息 4922,第 16 级,状态 9,第 1 行
ALTER TABLE ALTER COLUMN Col1 失败,因为一个 或更多对象访问此列。

因为同一个表作为依赖列

需要帮助

【问题讨论】:

  • 我使用的是SQL server 2000版本数据库
  • 看起来您有一些使用此表的进程。签入活动监视器。

标签: sql-server sql-server-2000


【解决方案1】:

SQL Server 会随着时间的推移自动将统计信息添加到表中,以便在解析查询和构建查询计划时使用。您必须删除统计信息才能更改列。例如:

drop statistics [dbo].[Tabl1].[_WA_Sys_Col1_5070F446]

但是,您应该在删除之前使用 SSMS 查看_WA_Sys_Col1_5070F446 统计信息中的列,以便重新创建它。像这样的:

create statistics [_WA_Sys_Col1_5070F446] on [dbo].[Tabl1]([Col1])

但可能会有更多列...,所以在删除之前一定要找出需要包含的列。

您可以运行此 SQL 来查找大多数依赖项,它不会报告统计依赖项,但它会捕获大多数其他依赖项:

SELECT OBJECT_NAME(d.object_id) AS SP_Or_Function, OBJECT_NAME(d.referenced_major_id) AS TableReferenced
FROM   sys.sql_dependencies AS d INNER JOIN
       sys.all_sql_modules AS m ON m.object_id = d.object_id
where  OBJECT_ID(N'Tabl1') = d.referenced_major_id
GROUP BY OBJECT_NAME(d.object_id), OBJECT_NAME(d.referenced_major_id)
ORDER BY SP_Or_Function, TableReferenced

您可以通过此查询找到给定表使用的所有统计信息:

SELECT DISTINCT
OBJECT_NAME(s.[object_id]) AS TableName,
c.name AS ColumnName,
s.name AS StatName,
s.auto_created,
s.user_created,
s.no_recompute,
s.[object_id],
s.stats_id,
sc.stats_column_id,
sc.column_id,
STATS_DATE(s.[object_id], s.stats_id) AS LastUpdated
FROM sys.stats s JOIN sys.stats_columns sc ON sc.[object_id] = s.[object_id] AND sc.stats_id = s.stats_id
JOIN sys.columns c ON c.[object_id] = sc.[object_id] AND c.column_id = sc.column_id
JOIN sys.partitions par ON par.[object_id] = s.[object_id]
JOIN sys.objects obj ON par.[object_id] = obj.[object_id]
WHERE OBJECTPROPERTY(s.OBJECT_ID,'IsUserTable') = 1
AND (s.auto_created = 1 OR s.user_created = 1)
AND object_id(N'Tabl1') = s.[object_id]

感谢最后两个 SQL 查询的 SQLAuthority:

SQL SERVER – Get the List of Object Dependencies – sp_depends and information_schema.routines and sys.dm_sql_referencing_entities (Gabriel's post)

SQL SERVER – Find Details for Statistics of Whole Database – DMV – T-SQL Script

【讨论】:

  • 我也尝试过这种方法,但没有运气,我放弃了所有正在访问此列的视图,但任何其他方法都没有运气
  • SQLSvr2000 的 SSMS 是否允许您查看/编辑表并为您编写整个更改的脚本?更高版本的 SSMS 脚本会删除所有依赖项、更改本身以及重新创建所有已删除的依赖项。
  • 是的,我正在使用 sql server 2005 ssms,其中我的数据库版本是 sql server 2000,我删除了依赖于该列的所有视图、统计信息,但仍然出现此错误对象“tabl1”依赖于列“col1”
  • 你会用你用来更改表的 SQL 更新你的问题吗?
【解决方案2】:

以下是 SQL Server 2000 帮助中的引述:

更改列

更改的列不能是:

.....

  • 在索引中使用,除非列是 varchar、nvarchar 或 varbinary 数据类型,数据类型不会改变,新的大小是 等于或大于旧尺寸。

  • 用于由 CREATE STATISTICS 语句生成的统计信息。首先使用 DROP STATISTICS 语句删除统计信息。 查询优化器自动生成的统计信息是 由 ALTER COLUMN 自动删除。 .....

【讨论】:

    猜你喜欢
    • 2012-09-20
    • 1970-01-01
    • 2019-03-05
    • 2012-06-16
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2018-11-06
    相关资源
    最近更新 更多