分区视图出现:“不可更新,因为没有找到分区列” 问题
--原因是约束被禁用了,所以提示找不到分区列
--启用这些约束就行了
ALTER TABLE InOutM2004 CHECK CONSTRAINT ALL
ALTER TABLE InOutM2003 CHECK CONSTRAINT ALL
go
-------------------------------------------------------------------
--如果还是不行,可以通过强制修改系统表来实现
exec SP_CONFIGURE 'ALLOW UPDATES',1 RECONFIGURE WITH OVERRIDE
go
update sysobjects set status=6
where xtype='C' and parent_obj in(object_id('InOutM2004'),object_id('InOutM2003'))
go
exec SP_CONFIGURE 'ALLOW UPDATES',0 RECONFIGURE WITH OVERRIDE
go
------------------------------------------------------------------
--或者重建约束也行
ALTER TABLE [dbo].[InOutM2003] DROP CONSTRAINT [CK__InOutM200__iSubY__25DB9BFC]
ALTER TABLE [dbo].[InOutM2003] ADD CONSTRAINT [CK__InOutM200__iSubY__25DB9BFC] CHECK ([iSubYear] = 2003)
ALTER TABLE [dbo].[InOutM2004] DROP CONSTRAINT [CK__InOutM200__iSubY__3AD6B8E2]
ALTER TABLE [dbo].[InOutM2004] ADD CONSTRAINT [CK__InOutM200__iSubY__3AD6B8E2] CHECK ([iSubYear] = 2004)
===============
分区列规则
分区列存在于每个成员表上,并且通过 CHECK 约束标识特定表中的可用数据。分区列必须遵守如下规则:
每个基表都拥有键值由 CHECK 约束所强制的分区列。每个表的 CHECK 约束的键范围与其它任何表互不重叠。任何分区列的给定值必须只能映射到一个表。CHECK 约束只能使用以下运算符:BETWEEN、AND、OR、<、<=、>、>=、=。
分区列不能是标识、默认或 timestamp 列。
在视图中,分区列必须位于每个 SELECT 语句的选择列表中相同的序号位置处。例如,分区列要么总是每个选择列表中的首列,要么总是每个选择列表中的第二列,依次类推。
分区列不允许为空。
分区列必须是表的主键的一部分。
分区列不能是计算列。
在分区列上必须只有一个约束。如果约束多于一个,SQL Server 会忽略所有的约束并在确定视图是否为分区视图时不考虑这些约束。
分区列的可更新性没有约束。
分区列存在于每个成员表上,并且通过 CHECK 约束标识特定表中的可用数据。分区列必须遵守如下规则:
每个基表都拥有键值由 CHECK 约束所强制的分区列。每个表的 CHECK 约束的键范围与其它任何表互不重叠。任何分区列的给定值必须只能映射到一个表。CHECK 约束只能使用以下运算符:BETWEEN、AND、OR、<、<=、>、>=、=。
分区列不能是标识、默认或 timestamp 列。
在视图中,分区列必须位于每个 SELECT 语句的选择列表中相同的序号位置处。例如,分区列要么总是每个选择列表中的首列,要么总是每个选择列表中的第二列,依次类推。
分区列不允许为空。
分区列必须是表的主键的一部分。
分区列不能是计算列。
在分区列上必须只有一个约束。如果约束多于一个,SQL Server 会忽略所有的约束并在确定视图是否为分区视图时不考虑这些约束。
分区列的可更新性没有约束。
------------------------------
另外, 楼主的表还有如下问题:
1. 日期的问题, 楼主把你的语句打印出来看看, 可以发现你的约束不是你想要的. 约束值不是一个日期, 也不是一个字符
2. 楼主的表有标识列, 因此, 是不能用INSERT的, 这在联机帮助上也有说明:
INSERT 语句
INSERT 语句通过分区视图将数据添加到成员表中。INSERT 语句必须遵守下列规则:
所有列必须包含在 INSERT 语句中,即使基表中的列可能为 NULL 或在基表中定义了 DEFAULT 约束。
不能在 INSERT 语句的 VALUES 子句中指定 DEFAULT 关键字。
INSERT 语句提供的值必须符合在一个成员表的分区列上定义的 CHECK 约束逻辑。
如果一个成员表包含具有标识属性的列,则不能使用 INSERT 语句。
如果一个成员表包含 timestamp 列,则不能使用 INSERT 语句。
如果存在具有同一视图或任一成员表的自联接,则不能使用 INSERT 语句。
1. 日期的问题, 楼主把你的语句打印出来看看, 可以发现你的约束不是你想要的. 约束值不是一个日期, 也不是一个字符
2. 楼主的表有标识列, 因此, 是不能用INSERT的, 这在联机帮助上也有说明:
INSERT 语句
INSERT 语句通过分区视图将数据添加到成员表中。INSERT 语句必须遵守下列规则:
所有列必须包含在 INSERT 语句中,即使基表中的列可能为 NULL 或在基表中定义了 DEFAULT 约束。
不能在 INSERT 语句的 VALUES 子句中指定 DEFAULT 关键字。
INSERT 语句提供的值必须符合在一个成员表的分区列上定义的 CHECK 约束逻辑。
如果一个成员表包含具有标识属性的列,则不能使用 INSERT 语句。
如果一个成员表包含 timestamp 列,则不能使用 INSERT 语句。
如果存在具有同一视图或任一成员表的自联接,则不能使用 INSERT 语句。