none
sql2000sp4 Isnull在视图中的问题 RRS feed

  • 问题

  • Win2k3 + SQL 2k DE 8.00.2282(SP4),补丁齐,突然出现一个奇怪的问题。
    有个视图,很简单,对表TableA、表TableB进行关联查询:
    TableA(
    UserID int,
    UserName
    )
    TableB(
    UserID int,
    IsCheck char(1) NOT NULL defualt 'N'
    )
    TableA中的UserID记录多于TableB中的UserID记录。
    视图语句为:
    Create View View_test
    AS
    select A.*, isnull(B.IsCheck,'X') as IsCheck from TableA as A left outer join TableB as B on a.UserID =b.UserID

    select * from View_test

    UserID UserName IsCheck
    1 user1 Y
    2 user2 X


    一直执行都正常,这个视图返回的IsCheck不会为空。但是,突然昨天某个时间开始,这个视图返回的IsCheck会为空了,用如下语句可以明确看出来差别
    select *, isnull(IsCheck,'X') as IsCheck2 from View_test

    UserID UserName IsCheck IsCheck2
    1 user1 Y Y
    2 user2 Null X

    IsCheck有为空(Null)的,而IsCheck2就能正常将Null转为'X'
    但是之前都不会有这种情况,因为写成 isnull(B.IsCheck.'X') as IsCheck就是为了防止这种情况出现

    从企业管理器里看这个View_test的代码、从查询分析器里获取这个View_test的代码都正常,无赖之下,只好再次重建了视图,但是实际上没有改变视图的创建命令。马上就一切都正常了,很是奇怪~~~~

    是Isnull还是view有什么禁忌么?
    2009年8月26日 3:33

答案

  • 找到问题原因了,SQL Server太弱智了,当视图中用*星号代替字段名时,如果更改了原表的字段结构,视图是不会更新的。TableA昨天被新加了字段,所以在视图输出时就占了IsCheck这个字段原本输入的位置
    2009年8月26日 4:53

全部回复

  • 找到问题原因了,SQL Server太弱智了,当视图中用*星号代替字段名时,如果更改了原表的字段结构,视图是不会更新的。TableA昨天被新加了字段,所以在视图输出时就占了IsCheck这个字段原本输入的位置
    2009年8月26日 4:53
  • You should refresh view with sp_refreshview after changing underlying table schema or use schema bind in the view.
    2009年8月26日 15:39