sqlserver2000 的視圖編譯問題

1 原來我一直認爲視圖純粹是sql語句的集合,但是現在看來,視圖也是會被編譯的。直接看例子。

首先 我定義了視圖V_sh_MainInfoSub,代碼如下

CREATE view V_sh_MainInfoSub //主要是幾個表的聯合查詢,沒有什麼複雜的操作
as
select 
m1.ma_id,
CONVERT(varchar(20), m1.ma_rep_datetime, 23) as ma_rep_datetime,
--(case ma_isOK when 1 then '已解決' when 2 then '待解決' else '未知' end) as 影響排序,暫時不用
m1.ma_isOK, 
m1.ma_appear, m1.ma_link, d.dev_pos_detail, 
(select i.item_info from sh_item i where i.item_order = d.dev_type 
and i.item_type_name = 'dev_type' and item_valid = 1) as dev_type,
(select i.item_info from sh_item i where i.item_order = d.dev_spec 
and i.item_type_name = 'dev_spec' and item_valid = 1) as dev_spec,
m1.ma_dev_GUID,--ma_dev_GUID和ma_order不用來顯示到頁面,
--當用戶更新MainInfo時,先通過id找到臨時表內容,然後通過ma_dev_GUID和ma_order找到sh_maintain的內容
m1.ma_order
from sh_maintain m1, sh_device d


where m1.ma_dev_GUID = d.dev_GUID 
and d.dev_valid = 1 
and m1.ma_valid = 1 


2 然後定義視圖 V_sh_MainInfo 注意比上面的名字少了sub,內容如下

CREATE view V_sh_MainInfo //調用了V_sh_MainInfoSub 。主要功能是爲查詢結果動態創建連續的id號
as 
select 
(select count(*) from V_sh_MainInfoSub v2 where v2.ma_id <= v1.ma_id) as id,
* from V_sh_MainInfoSub v1 

上面兩個視圖運行良好,沒有任何問題。


3 然後,由於需要,在sub視圖中增加了個別字段,修改之後的代碼如下

CREATE view V_sh_MainInfoSub //主要是幾個表的聯合查詢,沒有什麼複雜的操作
as
select 
m1.ma_id,
CONVERT(varchar(20), m1.ma_rep_datetime, 23) as ma_rep_datetime,
--(case ma_isOK when 1 then '已解決' when 2 then '待解決' else '未知' end) as 影響排序,暫時不用
m1.ma_isOK, 
m1.ma_appear, m1.ma_link, d.dev_pos_detail, 
(select i.item_info from sh_item i where i.item_order = d.dev_type 
and i.item_type_name = 'dev_type' and item_valid = 1) as dev_type,
(select i.item_info from sh_item i where i.item_order = d.dev_spec 
and i.item_type_name = 'dev_spec' and item_valid = 1) as dev_spec,
m1.ma_dev_GUID,--ma_dev_GUID和ma_order不用來顯示到頁面,
--當用戶更新MainInfo時,先通過id找到臨時表內容,然後通過ma_dev_GUID和ma_order找到sh_maintain的內容
m1.ma_order,
p.province as dev_province, 
c.city as dev_city,
a.area as dev_area

from sh_maintain m1, sh_device d, sh_province p, sh_city c, sh_area a


where m1.ma_dev_GUID = d.dev_GUID 
and d.dev_valid = 1 
and m1.ma_valid = 1 
and p.provinceID = dev_province 
and c.cityID = dev_city
and a.areaID = dev_area
and p.provinceID = c.father
and c.cityID = a.father


怪事出現了,單獨運行sub視圖沒問題,運行V_sh_MainInfo 裏面的語句也沒問題。注意是視圖裏的語句

select 
(select count(*) from V_sh_MainInfoSub v2 where v2.ma_id <= v1.ma_id) as id,
* from V_sh_MainInfoSub v1 

但是隻要運行 exec V_sh_MainInfo 就是看不到最後追加的三個字段dev_province ,dev_city,dev_area,

最後把V_sh_MainInfo 視圖刪除,重建,哎好了。

因此懷疑視圖也是經過了編譯了,以上是個人見解,歡迎批評指正



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章