更改SQL Server中的架构绑定视图引用的列的大小


124

我正在尝试使用以下方法在sql server中更改列的大小:

ALTER TABLE [dbo].[Address]
ALTER COLUMN [Addr1] [nvarchar](80) NULL

Addr1原本长度的地方40

它失败,引发此错误:

The object 'Address_e' is dependent on column 'Addr1'.
ALTER TABLE ALTER COLUMN Addr1 failed because one or more objects access 
this column.

我尝试对其进行阅读,似乎是因为某些视图引用了此列,而且SQL Server似乎实际上正在尝试删除引发错误的列。

Address_e 是由先前的数据库管理员创建的视图。

还有其他方法可以更改列的大小吗?


2
Address_e是由先前的数据库管理员创建的视图。就像Remus提到的一样,它定义了SCHEMABINDING。
Staelen

Answers:


58

视图可能是使用WITH SCHEMABINDING选项创建的,这意味着它们已显式连接以防止此类更改。看起来,模式绑定有效并且阻止了您破坏这些观点,幸运的一天,对吗?在断言对数据库的影响之后,请与您的数据库管理员联系并要求他进行更改。

MSDN

模式绑定

将视图绑定到一个或多个基础表的架构。指定SCHEMABINDING时,不能以会影响视图定义的方式修改一个或多个基本表。首先必须修改或删除视图定义本身,以删除对要修改的表的依赖。


1
感谢Remus,该视图确实定义了SCHEMABINDING。有什么简单的方法可以绕过约束,或者我是否真的需要删除视图才能使其正常工作?
Staelen

1
您不能绕过它,这就是它的全部目的。有人花了很多时间来添加schemabindig以防止表更改。这不是偶然的,看起来这个人知道正在做什么。您确定要更改表格吗?
Remus Rusanu 2009年

1
是的,我确定=)并且在逻辑上(即使我知道它不能那样工作)我正在增加列的长度,这只有在未删除和重新创建该列的情况下才可以,但是不幸的是事实并非如此...但是感谢您的帮助!= D
Staelen,2009年

2
我看到了同样的问题,很遗憾,我们正在使用SCHEMABINDING视图来为视图建立索引。因此,就我而言,我不是在使用SCHEMABINDING显式阻止对基础表的更改,而只是为了符合SQL Server对已使用索引视图的要求。我也想绕过这个,而不必删除并重新创建我的视图。
jpierson

256
ALTER TABLE [table_name] ALTER COLUMN [column_name] varchar(150)

11
不,问题就像雷木思提到的那样。代码本身没有错
Staelen 2012年

11
@NilRad Ummm,也许您正在考虑使用PL-SQL?ALTER COLUMN是SQL 2008 R2的正确语法
schmidlop 2014年

4
我想念什么吗?为什么这么多投票?它没有回答问题。
安迪·威森丹格

13
投票增加的原因可能是因为此问题是Google当前“ tsql alter nvarchar length”的热门话题,因此仅想提醒如何更改列长的人们(如我)就可以看到此答案-投票时说“谢谢”,而不会发现问题比问题标题所暗示的要微妙(正如我直到阅读您的评论之前一样)。
dumbledad 2015年

6

如果有人想在SQL Server 2008中“增加复制表的列宽”,则无需更改“ replicate_ddl=1” 的属性。只需按照以下步骤操作-

  1. 打开SSMS
  2. 连接到发布者数据库
  3. 运行命令- ALTER TABLE [Table_Name] ALTER COLUMN [Column_Name] varchar(22)
  4. 它将列宽从增大varchar(x)到,varchar(22)并且您可以在订阅服务器上看到相同的更改(复制了交易)。因此,无需重新初始化复制

希望这对所有正在寻找它的人有所帮助。



2

这是与我使用的程序版本兼容的功能:也可能对您有用。

我将放置执行该指令的命令。class是表的名称。您可以使用此方法在自己的表格中对其进行更改。不只是搜索过程的回报。


查看表类

select * from class

更改FacID(称为“ faci”)和classnumber(称为“ classnu”)列的长度以适合整个标签。

alter table class modify facid varchar (5);

alter table class modify classnumber varchar(11);

再次查看表以查看区别

select * from class;

(再次运行命令以查看区别)


这会改变实际表,但会更好。

PS我将这些说明作为命令的注释。这不是测试,但可以帮助一个:)


0

检查列排序规则。该脚本可能会将排序规则更改为表默认值。将当前排序规则添加到脚本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.