vtemp是视图,由vtemp2009xx组成,
在视图上执行下面语句提示4439错delete from vtemp where cardid= 5816 and downtime=(select max(downtime) from vtemp where downtime>='2009-08-07 12:08:06' and cardid = 5816)在单个vtemp2009xx中没问题,一旦在视图中加入其它vtemp2009xx,就出现4439错误

解决方案 »

  1.   

    在分区视图中修改数据更新日期: 2005 年 12 月 5 日 
    如果分区视图不可更新,则它只能作为原始表的只读副本。可更新的分区视图可提供原始表的所有功能。当视图是一组 SELECT 语句,这些语句各自的结果集使用 UNION ALL 语句合并在一起时,该视图被视为可更新的分区视图。每个 SELECT 语句引用一个 SQL Server 基表。该表可以是本地表,也可以是使用由四部分组成的名称、OPENROWSET 函数或 OPENDATASOURCE 函数引用的链接表(不能使用指定了直接传递查询的 OPENDATASOURCE 或 OPENROWSET 函数)。此外,引用该视图的数据修改语句必须遵守为 INSERT、UPDATE 和 DELETE 语句定义的规则。如果分区视图分布在多个服务器中,应避免对基表使用触发器或级联操作。触发器或级联操作可能会更改基础数据,这将影响视图定义。只有当用户对视图下的每个表都具有 CONTROL、ALTER、TAKE OWNERSHIP 或 VIEW DEFINITION 权限时,才能更新分布式分区视图参考一下
      

  2.   

    DELETE 语句通过分区视图在一个或多个成员表中删除数据。如果存在与同一视图或任意成员表的自联接,则不能使用 DELETE 语句。应该是这个原因
      

  3.   

    create view vtemp as
    select * from tempbefor --2009年以前数据
    union all select * from temp200901
    union all select * from temp200902
    union all select * from temp200903
    union all select * from temp200904
    union all select * from temp200905
    union all select * from temp200906
    union all select * from temp200907
    union all select * from temp200908
    union all select * from temp200909
    union all select * from temp200910
    union all select * from temp200911
    union all select * from temp200912
    union all select * from tempafter --2009年以后数据是不是上面的删除语句中又引用了视图分区的引用,所以不能删除
    直接delete from vtemp where cardid = xxxx 没有问题,是不是后面的select downtime = (select max(downtime) from vtemp 出的问题
    有什么方法能解决呢?
      

  4.   

    是后面出了问题,
    http://msdn.microsoft.com/zh-cn/library/ms187067(SQL.90).aspx你去MSDN参考一下