【发布时间】:2013-05-10 11:22:51
【问题描述】:
我被要求创建脚本,希望运行它的人提供员工 ID。找到所提供的员工在任何深度监督的所有员工。
我的代码是:
CREATE FUNCTION [dbo].[GetNames] (@V uniqueidentifier)
RETURNS @OldNames TABLE (EMP_NAME varchar(50))
AS
BEGIN
DECLARE @master uniqueidentifier
SET @master=(SELECT EMP_Supervisor FROM Employee WHERE EMP_ID=@v)
IF @master=NULL return
INSERT INTO @OldNames(EMP_NAME)
SELECT (SELECT EMP_NAME FROM Employee WHERE EMP_ID = @master)
FROM Employee
UNION
SELECT EMP_NAME FROM GetNames(@master)
RETURN
END
当我想看看它是否有效时,我执行这个:
SELECT * from GetNames('561e2d88-a747-460f-99e1-cfb1d3d8ca5c')
“561e2d88-a747-460f-99e1-cfb1d3d8ca5c”是员工的用户界面,我认为这是一个例外:
最大存储过程、函数、触发器或视图嵌套级别 超过(限制 32)。
你能帮帮我吗?提前致谢!!
【问题讨论】:
-
您使用的是什么数据库?在存储过程中使用递归肯定会遇到麻烦,而且是一个糟糕的设计。您正在寻找的是一种在层次结构中搜索的方法。有多种方法可以做到这一点,其中一些取决于您使用的特定 SQL 方言
-
stackoverflow.com/questions/959804/… (这似乎是 SQL 服务器考虑使用与示例链接中的语句
-
无论如何,员工->经理层次结构似乎非常不寻常,有 32 个级别。确定数据中没有循环?
-
我正在使用 SQL Server 给了我一个数据库并要求创建脚本,该脚本期望运行它的人提供员工 ID。正如我之前所写的,找到所提供的员工在任何深度监督的所有员工。雇员表是这样的: CREATE TABLE [dbo].[Employee]( [EMP_ID] [uniqueidentifier] NOT NULL, [EMP_Name] [nvarchar](100) NOT NULL, [EMP_DateOfHire] [datetime] NOT NULL, [EMP_Supervisor] [唯一标识符] NULL)
标签: sql sql-server stored-procedures