用了isnull还是返回null了,奇怪

li_zero 2009-08-26 11:37:19
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有什么禁忌么?
...全文
151 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
li_zero 2009-08-26
  • 打赏
  • 举报
回复
查了资料,原来是因为*号的问题,谢谢SQL77的解答。

没有什么开关自动在更改、传递这个更新么?SQL2k也太弱智了,不晓得在SQL2k5、SQL2k8中是否依然如此
feixianxxx 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 li_zero 的回复:]
系统里有很多视图,都没用过sp_refreshview,也不见出错呢?

并且这两个TableA、TableB也没有人改过结构呢~~

难道需要周期性的对所有视图执行sp_refreshview?


[/Quote]
如果 视图里运用的表 表结构发生变化 需要重建

定期执行sp_refreshview
li_zero 2009-08-26
  • 打赏
  • 举报
回复
系统里有很多视图,都没用过sp_refreshview,也不见出错呢?

并且这两个TableA、TableB也没有人改过结构呢~~

难道需要周期性的对所有视图执行sp_refreshview?

--小F-- 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sql77 的回复:]
SQL codesp_refreshview
刷新指定视图的元数据。由于视图所依赖的基础对象的更改,视图的持久元数据会过期。

语法
sp_refreshview[ @viewname =]'viewname'
[/Quote]

...学习
SQL77 2009-08-26
  • 打赏
  • 举报
回复
sp_refreshview
刷新指定视图的元数据。由于视图所依赖的基础对象的更改,视图的持久元数据会过期。

语法
sp_refreshview [ @viewname = ] 'viewname'
SQL77 2009-08-26
  • 打赏
  • 举报
回复
视图要刷新的
li_zero 2009-08-26
  • 打赏
  • 举报
回复
feixianxxx:结贴后才看见你的回复,谢谢了。

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧