知识大全 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)小编为大家搜集整理后发布
SQLServer2005数据转换服务 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 简介 由
SQLServer2005的cmd 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! SQLServ
安装指南:SQLServer2005安装及界面 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 如
SQLServer2005安全性(图) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 数据安全是
知识大全 Sql Server 2005自定义Split函数
SqlServer2005自定义Split函数 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 要