前面講的兩種類型的表表達式(派生表和CTE),它們的作用范圍都非常有限,僅限于在單個語句范圍內使用,只要包含這些表表達式的外部查詢完成操作,它們便隨它消失了。這也就意味著派生表和CTE都是不可重用的。
相較于派生表和CTE,視圖是一種可重用的表表達式,它定義在數據庫中。一旦創建,它就是數據庫的永久部分,只有用刪除命令顯示刪除它們才會從數據庫中刪除。下面是視圖的示例代碼。
USE TSQLFundamentals2008;GO-- 視圖-- 創建視圖IF OBJECT_ID('dbo.V_USACusts','V') IS NOT NULL DROP VIEW dbo.V_USACusts;GOCREATE VIEW dbo.V_USACustsASSELECT custid,companyname,contactname,contacttitle,address,city,region,postalcode,country,phone,faxFROM Sales.CustomersWHERE country= N'USA';GO-- 查詢視圖SELECT custid,companyname,region FROM dbo.V_USACustsORDER BY region;-- 修改視圖ALTER VIEW dbo.V_USACustsASSELECT custid,companyname,contactname,contacttitle,address,city,region,postalcode,country,phone,faxFROM Sales.CustomersWHERE country= N'USA';GO-- 查看視圖定義(通過函數OBJECT_DEFINITION)SELECT OBJECT_DEFINITION(OBJECT_ID('dbo.V_USACusts','V'));EXEC sys.sp_helptext @objname = N'dbo.V_USACusts';-- 修改視圖,指定ENCRYPTION選項,可以對視圖的定義進行混淆處理,這樣普通用戶無法查看ALTER VIEW dbo.V_USACusts WITH ENCRYPTIONASSELECT custid,companyname,contactname,contacttitle,address,city,region,postalcode,country,phone,faxFROM Sales.CustomersWHERE country= N'USA';GO-- 修改視圖,指定SCHEMABINDING選項,可以防止被引用的對象或列被刪除ALTER VIEW dbo.V_USACusts WITH SCHEMABINDINGASSELECT custid,companyname,contactname,contacttitle,address,city,region,postalcode,country,phone,faxFROM Sales.CustomersWHERE country= N'USA';GO-- 修改視圖,指定CHECK OPTION選項,防止通過視圖執行的數據修改與視圖中設置的過濾條件發生沖突ALTER VIEW dbo.V_USACustsASSELECT custid,companyname,contactname,contacttitle,address,city,region,postalcode,country,phone,faxFROM Sales.CustomersWHERE country= N'USA'WITH CHECK OPTION;GO
新聞熱點
疑難解答