Sql server 通过选择return返回值

Sql server 通过选择return返回值,sql-server,tsql,Sql Server,Tsql,有下面的mssql存储过程。我想根据sp中的结果检索值0或1,并从sp返回。在我的示例中,当我调试它时,当它达到我在查询中用第二个箭头注释点标记的值时,它不会转到选择0/返回0行,但在窗口中,我看不到任何列名0-表示似乎与预期一样好,但当我使用其他输入值进行调试时当它到达第一个箭头注释时,它也不会像我预期的那样选择1/返回1,并且不会像没有列名1那样显示任何消息。为什么在调试器中,它会在到达SELECT/RETURN statemts之前中断注释上的存储过程,为什么SELECT 1/RETURN

有下面的mssql存储过程。我想根据sp中的结果检索值0或1,并从sp返回。在我的示例中,当我调试它时,当它达到我在查询中用第二个箭头注释点标记的值时,它不会转到选择0/返回0行,但在窗口中,我看不到任何列名0-表示似乎与预期一样好,但当我使用其他输入值进行调试时当它到达第一个箭头注释时,它也不会像我预期的那样选择1/返回1,并且不会像没有列名1那样显示任何消息。为什么在调试器中,它会在到达SELECT/RETURN statemts之前中断注释上的存储过程,为什么SELECT 1/RETURN 1没有结果。我做错了什么

USE [temp]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[IsPhraseConnectedAlready]
    @PhraseId INT,
    @KatSubkatId INT,   
    @WordId INT,
    @SubsubkatId INT = NULL
AS
BEGIN
    SET NOCOUNT OFF;

    DECLARE @temp_T_Html_Word_Categories TABLE(Id INT)

    --spr. poziom 2-gi oraz wszystkie 3-cie
    IF @SubsubkatId IS NULL

        BEGIN
            INSERT INTO @temp_T_Html_Word_Categories(Id) SELECT Id FROM T_Html_Word_Categories WHERE FK_KatSubkat_ID = @KatSubkatId And FK_Word_ID = @WordId;


        Declare @id int;
        WHILE EXISTS(SELECT * FROM @temp_T_Html_Word_Categories)        
                BEGIN
                    Select Top 1 @id = Id From @temp_T_Html_Word_Categories;

                            BEGIN 
                                IF EXISTS (SELECT * FROM T_Html_WordCat_Phrase WHERE FK_Word_Categorie_ID=@id AND FK_Phrase_ID=@PhraseId)
                                    --INSERT SOMETHING
                                            --there is match existing already in db
                                        SELECT 1
                                        RETURN 1
                            END

                    Delete @temp_T_Html_Word_Categories Where Id = @Id;     
                END;

        --no match existing in db
        SELECT 0
        RETURN 0

        END


    --spr. ten konkretny poziom 3-ci oraz 2-gi
    ELSE
        BEGIN       
            INSERT INTO @temp_T_Html_Word_Categories(Id) SELECT Id FROM T_Html_Word_Categories WHERE FK_KatSubkat_ID = @KatSubkatId And FK_Word_ID = @WordId And FK_Subsubkat_ID = @SubsubkatId;
            INSERT INTO @temp_T_Html_Word_Categories(Id) SELECT Id FROM T_Html_Word_Categories WHERE FK_KatSubkat_ID = @KatSubkatId And FK_Word_ID = @WordId And FK_Subsubkat_ID IS NULL;


        Declare @id2 int;
        WHILE EXISTS(SELECT * FROM @temp_T_Html_Word_Categories)        
                BEGIN
                    Select Top 1 @id2 = Id From @temp_T_Html_Word_Categories;

                            BEGIN 
                                IF EXISTS (SELECT * FROM T_Html_WordCat_Phrase WHERE FK_Word_Categorie_ID=@id2 AND FK_Phrase_ID=@PhraseId)
                                    --INSERT SOMETHING
                                            --there is match existing already in db<--------------------------------------------------------
                                    SELECT 1
                                    RETURN 1
                            END



                    Delete @temp_T_Html_Word_Categories Where Id = @id2;        
                END

        --no match existing in db<--------------------------------------------------------
        SELECT 0
        RETURN 0

        END
END
如果存在不为null的某些查询,则这些查询也必须在我的sp中使用:

INSERT INTO @temp_T_Html_Word_Categories(Id) SELECT Id FROM T_Html_Word_Categories WHERE FK_KatSubkat_ID = @KatSubkatId And FK_Word_ID = @WordId And FK_Subsubkat_ID = @SubsubkatId;
            INSERT INTO @temp_T_Html_Word_Categories(Id) SELECT Id FROM T_Html_Word_Categories WHERE FK_KatSubkat_ID = @KatSubkatId And FK_Word_ID = @WordId And FK_Subsubkat_ID IS NULL;

我不确定您的简化版本是否与之匹配。

我不确定您想要什么,但我非常确定您可以将整个过程简化为这样一条语句。绝对没有必要循环并使其如此复杂

ALTER PROCEDURE [dbo].[IsPhraseConnectedAlready]
    @PhraseId INT,
    @KatSubkatId INT,   
    @WordId INT,
    @SubsubkatId INT = NULL
AS
BEGIN
    SET NOCOUNT OFF;

    select DoesItExist = convert(bit, count(*)) 
    from T_Html_Word_Categories c
    join T_Html_WordCat_Phrase wcp pm wcp.FK_Word_Categorie_ID = c.ID AND FK_Phrase_ID=@PhraseId
    WHERE c.FK_KatSubkat_ID = @KatSubkatId 
        And c.FK_Word_ID = @WordId
        And c.FK_Subsubkat_ID = isnull(@SubsubkatId, c.FK_Subsubkat_ID)

END

为什么在这里使用循环?这只不过是对EXISTS进行一次查询,或者可能与join一样简单,但要通过最复杂的路径到达那里。@SeanLange,因为可能有多个结果,并且必须循环到每个结果中。首先,它将找到需要返回值并停止sp的内容。但您只是在检查是否存在……在这里循环是一种非常缓慢的方法。@SeanLange然后您能提出解决方案吗?尽管如此,我还是想理解它为什么会这样。代码比您认为的要快的原因是IF语句没有begin/end。同样地,IF语句将只执行下一行。
ALTER PROCEDURE [dbo].[IsPhraseConnectedAlready]
    @PhraseId INT,
    @KatSubkatId INT,   
    @WordId INT,
    @SubsubkatId INT = NULL
AS
BEGIN
    SET NOCOUNT OFF;

    select DoesItExist = convert(bit, count(*)) 
    from T_Html_Word_Categories c
    join T_Html_WordCat_Phrase wcp pm wcp.FK_Word_Categorie_ID = c.ID AND FK_Phrase_ID=@PhraseId
    WHERE c.FK_KatSubkat_ID = @KatSubkatId 
        And c.FK_Word_ID = @WordId
        And c.FK_Subsubkat_ID = isnull(@SubsubkatId, c.FK_Subsubkat_ID)

END