将列设置为' not null'在SQL Server中

时间:2017-03-13 09:02:41

标签: sql sql-server

我在sql server数据库的表中有一列我要设置为' not null'。但是,当我执行查询

ALTER TABLE mytable ALTER COLUMN mycolumn INT NOT NULL 

我得到了

ALTER TABLE ALTER COLUMN mycolumn failed because one or more objects access this column.

如何找出是什么类型的对象以及如何删除它?数据库非常简单,不应该使用外键,触发器等。

2 个答案:

答案 0 :(得分:2)

您可以搜索sys表以找出依赖于列的内容。这当然有其局限性,但是大体上应该能够为您提供一些依赖于您的专栏的指示:

SELECT
     OBJECT_NAME(D.Object_ID) AS [Dependent]
    ,D.Object_ID
FROM sys.sql_dependencies D
INNER JOIN sys.Columns C
    ON C.object_id = D.referenced_major_id
    AND C.column_id = D.referenced_minor_id
WHERE OBJECT_NAME(C.object_id) = 'MyTable'
AND C.name = 'MyColumn'
;

一旦你拥有了依赖项的名称和object_id(它可能是一个函数,一个存储过程或任何数量的东西),你就可以从那里开始。

答案 1 :(得分:1)

在更改此表之前,您可能必须首先删除列上的约束。这可能是约束,索引或任何事物。下面是一个显示相同的小型演示

create table #test
(
id int,
id1 int
)

create index nci_t on #test(id1)
include(id)

alter table #test
alter column id1 varchar(10)

这是我得到的错误

  

Msg 5074,Level 16,State 1,Line 2
  索引' nci_t'取决于列' id1'。
  Msg 4922,Level 16,State 9,Line 2
  ALTER TABLE ALTER COLUMN id1失败,因为一个或多个对象访问此列。

也请粘贴整个错误消息,不要剥开它