-3
ALTER PROCEDURE [dbo].[p_ReturnEmployeeOrg]
( @BusinessEntityID int = 21 ) **-- NOT WORKING**
AS
SELECT * FROM HumanResources.Employee
;WITH cte_Emp (EmployeeID,ManagerID,Title,EmployeeName,ManagerName,EmployeeLevel)
AS
-- Anchor member definition
(SELECT e.BusinessEntityID,e.MaritalStatus,e.JobTitle,
        CAST(c.LastName + ',' + c.FirstName AS VARCHAR(200)),
        CAST ('N/A' AS VARCHAR(200)),
        CAST (0 AS INT)
    FROM HumanResources.Employee e 
    INNER JOIN Person.Person c
        ON e.BusinessEntityID = c.BusinessEntityID
        WHERE e.BusinessEntityID = @BusinessEntityID

 UNION ALL
-- Recursive member definition 
SELECT  e.BusinessEntityID,e.MaritalStatus,e.JobTitle, 
                CAST(c.LastName + ',' + c.FirstName AS VARCHAR(200)),
                CAST ('N/A' AS VARCHAR(200)),
                CAST (0 AS INT)
        FROM HumanResources.Employee e
        INNER JOIN Person.Person c
        ON e.BusinessEntityID = c.BusinessEntityID)
        ORDER BY EmployeeLevel - **NOT WORKING**

       EXEC p_ReturnEmployeeOrg 21) 

-- exec は機能していません。結果は BusinessEntityID = 21 ではなく生データです。

4

1 に答える 1

1

最初の select ステートメントをストアド プロシージャの最後に配置するつもりでしたか? ストアド プロシージャには 3 つの関連する問題があります。まず、CTE が定義されていますが、ストアド プロシージャでは使用されていません (これが、sp が従業員テーブルからすべてを返す理由です)。第二に、あなたの exec ステートメントは実際に CTE 定義の途中でカットされます (これは、投稿中にフォーマット エラーが発生した可能性があると思います)。CTE の order by ステートメントは、おそらくエラーを引き起こします。CTE の外に移動することをお勧めします。

ALTER PROCEDURE [dbo].[p_ReturnEmployeeOrg]
( @BusinessEntityID int = 21 ) 
AS

;WITH cte_Emp (EmployeeID,ManagerID,Title,EmployeeName,ManagerName,EmployeeLevel)
AS
-- Anchor member definition
(SELECT e.BusinessEntityID,e.MaritalStatus,e.JobTitle,
        CAST(c.LastName + ',' + c.FirstName AS VARCHAR(200)),
        CAST ('N/A' AS VARCHAR(200)),
        CAST (0 AS INT)
    FROM HumanResources.Employee e 
    INNER JOIN Person.Person c
        ON e.BusinessEntityID = c.BusinessEntityID
        WHERE e.BusinessEntityID = @BusinessEntityID

 UNION ALL
-- Recursive member definition 
SELECT  e.BusinessEntityID,e.MaritalStatus,e.JobTitle, 
                CAST(c.LastName + ',' + c.FirstName AS VARCHAR(200)),
                CAST ('N/A' AS VARCHAR(200)),
                CAST (0 AS INT)
        FROM HumanResources.Employee e
        INNER JOIN Person.Person c
        ON e.BusinessEntityID = c.BusinessEntityID)
) 
SELECT * FROM cte_emp ORDER BY EmployeeLevel 
--....................  

EXEC p_ReturnEmployeeOrg 21

CTE 定義の終了直後に select ステートメントを下に移動し、テーブル名を employee から cte_emp に変更しました。また、あなたの exec ステートメントを CTE 定義から移動しました。

ただし、これには他の関連しない問題があります。RichardTheKiwi が述べたように、CTE 定義に e.maritalstatus があるのに、CTE ヘッダーに ManagerID があるのはなぜですか? CTE定義のbusinessentityidは、CTEヘッダーのemployeeidであることを意味していますか?

于 2012-10-14T22:46:40.333 に答える