程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQLServer2005Beta2Transact-SQL功能(4)

SQLServer2005Beta2Transact-SQL功能(4)

編輯:關於SqlServer
這裡需要注意兩個事情。第一,Departments 中的每個行都被復制與從 fn_getsubtree 中為該部門的經理返回的行數一樣多的次數。第二,Gardening 部門不會出現在結果中,因為 fn_getsubtree 為其返回空集。
  
  CROSS APPLY 運算符的另一個實際運用可以滿足以下常見請求:為每個組返回 n 行。例如,以下函數返回給定客戶的請求數量的最新定單:
  
  USE AdventureWorks
  GO
  CREATE FUNCTION fn_getnorders(@custid AS INT, @n AS INT)
   RETURNS TABLE
  AS
  RETURN
   SELECT TOP(@n) *
   FROM Sales.SalesOrderHeader
   WHERE CustomerID = @custid
   ORDER BY OrderDate DESC
  GO
  
  使用 CROSS APPLY 運算符,可以通過下面的簡單查詢獲得每個客戶的兩個最新定單:
  
  SELECT O.*
  FROM Sales.Customer AS C
   CROSS APPLY fn_getnorders(C.CustomerID, 2) AS O
  
  有關 TOP 增強功能的詳細信息,請參閱下文中的“TOP 增強功能”。
  
  OUTER APPLY
  
  OUTER APPLY 非常類似於 CROSS APPLY,但是它還從表值函數為其返回空集的外部表中返回行。空值作為與表值函數的列相對應的列值返回。例如,修改針對上一節中的 Departments 表的查詢以使用 OUTER APPLY 而不是 CROSS APPLY,並且注意輸出中的最後一行:
  
  SELECT *
  FROM Departments AS D
   OUTER APPLY fn_getsubtree(D.deptmgrid) AS ST
  
  以下為結果集:
  
  deptid   deptname  deptmgrid  empid    empname  mgrid    lvl
  ----------- ---------- ----------- ----------- ---------- ----------- ---
  1      HR     2      2      Andrew   1      0
  1      HR     2      5      Steven   2      1
  1      HR     2      6      Michael  2      1
  2      Marketing 7      7      Robert   3      0
  2      Marketing 7      11     David   7      1
  2      Marketing 7      12     Ron    7      1
  2      Marketing 7      13     Dan    7      1
  2      Marketing 7      14     James   11     2
  3      Finance  8      8      Laura   3      0
  4      R&D    9      9      Ann    3      0
  5      Training  4      4      Margaret  1      0
  5      Training  4      10     Ina    4      1
  6      Gardening NULL    NULL    NULL    NULL    NULL
  
  返回頁首
  相關子查詢中的表值函數
  在 SQL Server 2000 中,不能在相關子查詢內部引用表值函數。與提供 APPLY 關系運算符一道,該限制在 SQL Server 2005 Beta 2 中被移除。現在,在子查詢內部,可以向表值函數提供外部查詢中的列作為參數。例如,如果您希望只返回那些經理至少具有三名雇員的部門,則可以編寫以下查詢:
  
  SELECT *
  FROM Departments AS D
  WHERE (SELECT COUNT(*)
      FROM fn_getsubtree(D.deptmgrid))

>= 3
  deptid   deptname         deptmgrid
  ----------- ------------------------- -----------
  1      HR            2
  2      Marketing         7
  
  對新的 DRI 操作的支持:
  SET DEFAULT 和 SET NULL
  
  ANSI SQL 定義了四個可能的引用操作,以支持 FOREIGN KEY 約束。您可以指定這些操作,以表明您希望系統如何響應針對由外鍵引用的表的 DELETE 或 UPDATE 操作。SQL Server 2000 支持這些操作中的兩個:NO ACTION 和 CASCADE。SQL Server 2005 Beta 2 添加了對 SET DEFAULT 和 SET NULL 引用操作的支持。
  
  SET DEFAULT 和 SET NULL 引用操作擴展了聲明性引用完整性 (DRI) 功能。您可以在外鍵聲明中將這些選項與 ON UPDATE 和 ON DELETE 子句結合使用。SET DEFAULT 意味著,當您在被引用的表中刪除行 (ON DELETE) 或更新被引用的鍵 (ON UPDATE) 時,SQL Server 會將引用表中的相關行的引用列值設置為該列的默認值。類似地,如果您使用 SET NULL 選項,則 SQL Server 可以通過將值設置為 NULL 進行反應(前提是引用列允許使用空值)。
  
  例如,以下 Customers 表具有三個真實客戶和一個虛擬客戶:
  
  CREATE TABLE Customers
  (
   customerid CHAR(5) NOT NULL,
   /* other columns */
   CONSTRAINT PK_Customers PRIMARY KEY(customerid)
  )
  
  INSERT INTO Customers VALUES('DUMMY')
  INSERT INTO Customers VALUES('FRIDA')
  INSERT INTO Customers VALUES('GNDLF')
  INSERT INTO Customers VALUES('BILLY')
  
  Orders 表跟蹤定單。不一定非要將定單分配給真實客戶。如果您輸入一個定單並且未指定客戶 ID,則默認情況下會將 DUMMY 客戶 ID 分配給該定單。在從 Customers 表中進行刪除時,您希望 SQL Server 在 Orders 中的相關行的 customerid 列中設置 NULL。customerid 列中含有 NULL 的定單成為“孤兒”,也就是說,它們不屬於任何客戶。假設您還希望允許對 Customers 中的 customerid 列進行更新。您可能希望將對 Orders 中的相關行進行的更新級聯,但是假設公司的業務規則另行規定:應當將屬於 ID 被更改的客戶的定單與默認客戶 (DUMMY) 相關聯。在對 Customers 中的 customerid 列進行更新時,您希望 SQL Server 將默認值 'DUMMY' 設置為 Orders 中的相關客戶 ID (customerid)。您用外鍵按如下方式創建 Orders 表,並且用一些定單填充它:
  
  CREATE TABLE Orders
  (
   orderid  INT   NOT NULL,
   customerid CHAR(5) NULL DEFAULT('DUMMY'),
   orderdate DATETIME N


您正在看的SQLserver教程是:SQLServer2005Beta2Transact-SQL功能(4)。OT NULL,
   CONSTRAINT PK_Orders PRIMARY KEY(orderid),
   CONSTRAINT FK_Orders_Customers
    FOREIGN KEY(customerid)
    REFERENCES Customers(customerid)
     ON DELETE SET NULL
     ON UPDATE SET DEFAULT
  )
  INSERT INTO Orders VALUES(10001, 'FRIDA', '20040101')
  INSERT INTO Orders VALUES(10002, 'FRIDA', '20040102')
  INSERT INTO Orders VALUES(10003, 'BILLY', '20040101')
  INSERT INTO Orders VALUES(10004, 'BILLY',

'20040103')
  INSERT INTO Orders VALUES(10005, 'GNDLF', '20040104')
  INSERT INTO Orders VALUES(10006, 'GNDLF', '20040105')
  
  要測試 SET NULL 和 SET DEFAULT 選項,請發出下列 DELETE 和 UPDATE 語句:
  
  DELETE FROM Customers
  WHERE customerid = 'FRIDA'
  UPDATE Customers
   SET customerid = 'DOLLY'
  WHERE customerid = 'BILLY'
  
  結果,FRIDA 的定單被分配 customerid 列中的空值,而 BILLY 的定單被分配 DUMMY:
  
  orderid   customerid orderdate
  ----------- ---------- ----------------------
  10001    NULL    1/1/2004 12:00:00 AM
  10002    NULL    1/2/2004 12:00:00 AM
  10003    DUMMY   1/1/2004 12:00:00 AM
  10004    DUMMY   1/3/2004 12:00:00 AM
  10005    GNDLF   1/4/2004 12:00:00 AM
  10006    GNDLF   1/5/2004 12:00:00 AM
  
  請注意,如果您使用 SET DEFAULT 選項,引用列具有非空默認值且該值在被引用的表中不具有相應值,則當您發出觸發操作時,將獲得錯誤。例如,如果您從 Customers 中刪除 DUMMY 客戶,然後將 GNDLF 的 customerid 更新為 GLDRL,則會獲得錯誤。UPDATE 觸發一個 SET DEFAULT 操作,該操作試圖向 GNDLF 的原始定單分配在 Customers 中不具有相應行的 DUMMY 客戶 ID:
  
  DELETE FROM Cust

omers
  WHERE customerid = 'DUMMY'
  UPDATE Customers
   SET customerid = 'GLDRL'
  WHERE customerid = 'GNDLF'
  .Net SqlClIEnt Data Provider: Msg 547, Level 16, State 0, Line 1
  UPDATE statement conflicted with COLUMN FOREIGN KEY constraint 'FK_Orders_Customers'.
  The conflict occurred in database 'tempdb', table 'Customers', column 'customerid'.
  The statement has been terminated.
  
  通過查看 sys.foreign_keys,您可以找到有關外鍵的詳細信息,包括它們的已定義的引用操作。
  
  性能和錯誤處理增強功能
  
  本節討論用來解決以前版本的 SQL Server 中的性能問題的增強功能,提高您的數據加載能力,並且顯著改善您的錯誤管理能力。這些增強功能包括 BULK 行集提供程序和 TRY...CATCH 錯誤處理結構。
  
  BULK 行集提供程序
  
  BULK 是 OPENROWSET 函數中指定的新的行集提供程序,它使您可以訪問關系格式的文件數據。為了從文件中檢索數據,您可以指定 BULK 選項、文件名以及用 bcp.exe 創
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved