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