0

次のクエリはSQLServer用に記述されており、ハードコーディング@TempStaffすると正常に機能し、に値@Tempstaffがありますが、このようなコードは何も返しません。

クエリは、スタッフレベル以下のすべての従業員を収集することです。

DECLARE 
    @TempStaff  varchar(10),
    @staff_Full_name varchar (30)   
BEGIN
SELECT @staff_Full_name = 'Doe, John'
DECLARE @staffNameTable TABLE
    (
    StaffID     char(7),
    StaffName   Varchar(50)
    )
INSERT INTO @staffNameTable
SELECT * FROM dbo.fn_Staff_Full_Name()

SELECT  @TempStaff =    (
                SELECT  StaffId
                FROM    @staffNameTable st
                WHERE   st.StaffName = @staff_Full_name 
                )
END 
DECLARE @staff  TABLE
            (
    StaffId char(10)
    )

INSERT INTO @staff (StaffId)
SELECT * FROM dbo.fn_Supervisor_List(10, @TempStaff)`

機能は

ALTER FUNCTION [dbo].[fn_Supervisor_List] 
(
    @looptill   Int,
    @StaffId    varchar(10)
)
RETURNS 
@staff  TABLE
    (
    StaffId char(10)
    )
AS
BEGIN
    DECLARE 
        @loop       int 

    INSERT  INTO    @staff
    SELECT  s.StaffId
    FROM    Staff s with (nolock)
    WHERE   s.StaffId like @StaffId

    BEGIN
        SELECT  @loop = 0

        WHILE   @loop < @looptill 
        BEGIN

            INSERT  INTO    @staff
            SELECT  s.StaffId
            FROM    dbo.StaffSupervisors s with (nolock)
            --WHERE s.super_id in   (
            WHERE   s.SupervisorId in   (
                        SELECT  s2.StaffId
                        FROM    @Staff s2
                        )
            AND s.StaffId not in    (
                            SELECT  s2.StaffId
                            FROM    @Staff s2
                            )
            SELECT  @loop = @loop + 1
        END
    END
    RETURN 
END

入力後にSELECT@TempStaffを実行すると、期待する変数が得られますが、最後にSELECT * FROM @Staffを実行すると、@Staffは空になります。

4

1 に答える 1

0

問題を理解しました。Value@TempStaffをVarcharとして宣言しましたが、INTに変更すると、正常に機能しました。提案を投稿してくださった皆様、ありがとうございました。私は確かにCTEを調べます。

于 2012-10-10T13:00:35.957 に答える