3

誰が実行しても従業員 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」は従業員の ui であり、例外としてこれを取得します。

ストアド プロシージャ、関数、トリガー、またはビューの最大ネスト レベルを超えました (制限 32)。

手伝ってくれませんか?前もって感謝します!!

4

1 に答える 1

4

SQL Server を使用しているとしましょう

次の例を見てください。

DECLARE @EmployeeStructure TABLE(
        ID INT,
        Name VARCHAR(MAX),
        ManagerID INT
)

INSERT INTO @EmployeeStructure SELECT 1, 'a', NULL
INSERT INTO @EmployeeStructure SELECT 2, 'b', 1
INSERT INTO @EmployeeStructure SELECT 3, 'c', 1
INSERT INTO @EmployeeStructure SELECT 4, 'd', 2
INSERT INTO @EmployeeStructure SELECT 5, 'e', 2
INSERT INTO @EmployeeStructure SELECT 6, 'f', 2

DECLARE @EmployeeID INT = 2

;WITH Employee AS (
        SELECT  Name, ID
        FROM    @EmployeeStructure e 
        WHERE   ManagerID = @EmployeeID
        UNION ALL
        SELECT  es.Name,
                es.ID
        FROM    Employee e INNER JOIN
                @EmployeeStructure es   ON  e.ID = es.ManagerID
)
SELECT  Name
FROM    Employee
OPTION (MAXRECURSION 0)

SQL フィドルのデモ

それに加えて、多分見てください

共通テーブル式再帰クエリの使用 共通テーブル式の使用

また、

クエリ ヒント (Transact-SQL)

MAXRECURSION 数

このクエリで許可される再帰の最大数を指定します。number は、0 から 32767 までの負でない整数です。0 を指定すると、制限は適用されません。このオプションが指定されていない場合、サーバーのデフォルトの制限は 100 です。

クエリの実行中に MAXRECURSION 制限の指定された数またはデフォルトの数に達すると、クエリは終了し、エラーが返されます。

このエラーのため、ステートメントのすべての効果がロールバックされます。ステートメントが SELECT ステートメントの場合、部分的な結果が返されるか、結果が返されない場合があります。返される部分的な結果には、指定された最大再帰レベルを超える再帰レベルのすべての行が含まれない場合があります。

于 2013-05-10T11:29:45.220 に答える