知识大全 SQL Server 2005 Beta 2 Transact-SQL功能(2)

Posted

篇首语:春蚕到死丝方尽,人至期颐亦不休。一息尚存须努力,留作青年好范畴。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 SQL Server 2005 Beta 2 Transact-SQL功能(2)相关的知识,希望对你有一定的参考价值。

SQL Server 2005 Beta 2 Transact-SQL功能(2)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   单父节点环境 雇员组织结构图    对于单父节点层次结构方案 使用雇员组织结构图     注 本节中的示例使用一个名为 Employees 的表 该表具有与 AdventureWorks 中的 HumanResources Employee 表不同的结构 您应当在自己的测试数据库或 tempdb 中运行代码 而不要在 AdventureWorks 中运行代码     以下代码生成 Employees 表并且用示例数据填充它     USE tempdb or your own test database  CREATE TABLE Employees  (   empid  int     NOT NULL    mgrid  int     NULL    empname varchar( ) NOT NULL    salary money    NOT NULL    CONSTRAINT PK_Employees PRIMARY KEY(empid)    CONSTRAINT FK_Employees_mgrid_empid  FOREIGN KEY(mgrid)  REFERENCES Employees(empid)  )  CREATE INDEX idx_nci_mgrid ON Employees(mgrid)  SET NOCOUNT ON  INSERT INTO Employees VALUES( NULL Nancy   $ )  INSERT INTO Employees VALUES(   Andrew   $ )  INSERT INTO Employees VALUES(   Janet   $ )  INSERT INTO Employees VALUES(   Margaret $ )  INSERT INTO Employees VALUES(   Steven   $ )  INSERT INTO Employees VALUES(   Michael $ )  INSERT INTO Employees VALUES(   Robert   $ )  INSERT INTO Employees VALUES(   Laura   $ )  INSERT INTO Employees VALUES(   Ann    $ )  INSERT INTO Employees VALUES(   Ina    $ )  INSERT INTO Employees VALUES(   David   $ )  INSERT INTO Employees VALUES(   Ron    $ )  INSERT INTO Employees VALUES(   Dan    $ )  INSERT INTO Employees VALUES(   James   $ )    每个雇员都向其 ID 存储在 mgrid 列中的经理汇报 在引用 empid 列的 mgrid 列上定义了一个外键 这意味着经理 ID 必须对应于该表中的一个有效雇员 ID 或者为 NULL 老板 Nancy 在 mgrid 列中具有 NULL 值 经理 雇员关系如图 所示      图 雇员组织结构图    下面是一些可能在 Employees 表上运行的常见请求     显示有关 Robert (empid= ) 及其所有级别下属的详细信息     显示有关比 Janet (empid= ) 低两个级别的所有雇员的详细信息     显示通向 James (empid= ) 的管理链     显示有多少个雇员直接或间接向每个经理汇报     以适当的方式显示所有雇员 以便可以容易地查看他们的层次依赖项     递归 CTE 提供了处理上述请求(它们在本质上是递归的)的手段 而无须在数据库中维护有关层次结构的其他信息     第一个请求可能是最常见的一个请求 返回某个雇员(例如 empid= 的 Robert)及其所有级别的下属 以下 CTE 提供了对该请求的解决方案     WITH EmpCTE(empid empname mgrid lvl)  AS  (      Anchor Member (AM)   SELECT empid empname mgrid    FROM Employees   WHERE empid =    UNION ALL      Recursive Member (RM)   SELECT E empid E empname E mgrid M lvl+    FROM Employees AS E  JOIN EmpCTE AS M   ON E mgrid = M empid  )  SELECT * FROM EmpCTE    以下为结果集     empid    empname          mgrid    lvl            Robert                         David                         Ron                          Dan                          James                     按照先前描述的递归 CTE 逻辑 该 CTE 被按如下方式处理     锚定成员被激活 并且从 Employees 表中返回 Robert 的行 请注意在 lvl 结果列中返回的常量      递归成员被反复激活 并且借助于 Employees 和 EmpCTE 之间的联接操作返回上一个结果的直接下属 Employees 代表下属 而 EmpCTE(它包含上一个调用的结果)代表经理     首先 Robert 的下属被返回 David Ron 和 James     然后 David Ron 和 Dan 的下属被返回 只有 James     最后 James 的下属被返回 无 — 在这种情况下 递归终止      外部查询从 EmpCTE 中返回所有行     请注意 对于每个递归调用 lvl 值反复递增     使用该级别计数器 您可以限制递归中的迭代次数 例如 以下 CTE 用来返回比 Janet 低两个级别的所有雇员     WITH EmpCTEJanet(empid empname mgrid lvl)  AS  (   SELECT empid empname mgrid    FROM Employees   WHERE empid =    UNION ALL     SELECT E empid E empname E mgrid M lvl+    FROM Employees as E  JOIN EmpCTEJanet as M   ON E mgrid = M empid   WHERE lvl <   )  SELECT empid empname  FROM EmpCTEJanet  WHERE lvl =     以下为结果集     empid    empname           David        Ron        Dan    该代码示例中比上一个代码示例增加的代码以粗体显示 递归成员中的筛选器 WHERE lvl < 被用作递归终止检查 — 当 lvl = 时 不会返回任何行 因而递归停止 外部查询中的筛选器 WHERE lvl = 用来移除上至级别 的所有级别 请注意 从逻辑上讲 外部查询中的筛选器 (lvl = ) 本身就足以只返回所需的行 递归成员中的筛选器 (lvl < ) 是出于性能原因而添加的 — 为了在返回 Janet 下的两个级别之后立即停止递归     正如前面提到的那样 CTE 可以引用在同一批处理中定义的本地变量 例如 为了使查询更一般化 您可以使用变量而不是常量作为雇员 ID 和级别     DECLARE @empid AS INT @lvl AS INT  SET @empid = Janet  SET @lvl  = o levels  WITH EmpCTE(empid empname mgrid lvl)  AS  (   SELECT empid empname mgrid    FROM Employees   WHERE empid = @empid   UNION ALL     SELECT E empid E empname E mgrid M lvl+    FROM Employees as E  JOIN EmpCTE as M   ON E mgrid = M empid   WHERE lvl < @lvl  )  SELECT empid empname  FROM EmpCTE  WHERE lvl = @lvl    您可以使用提示在已经调用一定数量的递归迭代之后强行终止查询 可以通过在外部查询的结尾添加 OPTION(MAXRECURSION value) 做到这一点 如以下示例所示     WITH EmpCTE(empid empname mgrid lvl)  AS  (   SELECT empid empname mgrid    FROM Employees   WHERE empid =    UNION ALL     SELECT E empid E empname E mgrid M lvl+    FROM Employees as E  JOIN EmpCTE as M   ON E mgrid = M empid  )  SELECT * FROM EmpCTE  OPTION (MAXRECURSION )    以下为结果集     empid    empname          mgrid    lvl            Nancy           NULL              Andrew                          Janet                          Margaret                        Ina                           Robert                          Laura                          Ann                     Net SqlClient Data Provider: Msg Level State Line   Statement terminated Maximum recursion has been exhausted before statement pletion    可能返回(但是不能保证返回)迄今生成的结果 并且生成错误 您可能会想到使用 MAXRECURSION 选项实现以下请求 使用 MAXRECURSION 提示而不是递归成员中的筛选器返回 Janet 下两个级别的雇员     WITH EmpCTE(empid empname mgrid lvl)  AS  (   SELECT empid empname mgrid    FROM Employees   WHERE empid =    UNION cha138/Article/program/SQLServer/201311/21971

相关参考

知识大全 SQL Server2005的XML数据类型之基础篇[2]

SQLServer2005的XML数据类型之基础篇[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 SQL Server 数据库管理常用的SQL和T-SQL语句[2]

SQLServer数据库管理常用的SQL和T-SQL语句[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 如何用SQL SERVER 2005连接SQL SERVER 2008

如何用SQLSERVER2005连接SQLSERVER2008  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

知识大全 SQL Server 2005和SQL Server 2000数据的相互导入

SQLServer2005和SQLServer2000数据的相互导入  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快

知识大全 安装sql server 2008 management提示已安装 SQL Server 2005

安装sqlserver2008management提示已安装SQLServer2005  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布

知识大全 SQL Server 2005 数据转换服务

SQLServer2005数据转换服务  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  简介  由

知识大全 SQL Server 2005的cmd

SQLServer2005的cmd  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  SQLServ

知识大全 SQL Server 2005安装及界面

安装指南:SQLServer2005安装及界面  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  如

知识大全 SQL Server 2005 安全性(图)

SQLServer2005安全性(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  数据安全是

知识大全 Sql Server 2005自定义Split函数

SqlServer2005自定义Split函数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  要