【问题标题】:IF statement using output of SPROC SQL [duplicate]使用 SPROC SQL 输出的 IF 语句 [重复]
【发布时间】:2018-12-05 14:18:30
【问题描述】:

我正在创建存储过程 (sprocs) 来对数据库中的表执行操作。我有一个 sproc SubjectExists 如果输入的主题名称在主题表中则返回“1”,如果不存在则返回“0”。

CREATE PROCEDURE SubjectExists @SubjName varhcar(20)
AS
SELECT CASE WHEN EXISTS(
SELECT *
FROM Subject 
WHERE Subject_Name = @SubjName
)
THEN CAST (1 AS BIT)
ELSE CAST (0 AS BIT)
END

我现在正在制作另一个从表中删除主题的存储过程。我想让这个存储过程使用SubjectExists,如果它的输出是1(即主题确实存在),那么它会删除主题,如果SubjectExists的输出是0,它什么也不做。

我该怎么做呢?

我尝试过以下方法,但到目前为止没有运气。

CREATE PROCEDURE DeleteSubject @SubjName varchar(20)
AS
IF (EXEC StudentExists Bob)
DELETE FROM Subject 
WHERE Subject_Name = @SubjName;

谁能指导我如何做到这一点。 谢谢

【问题讨论】:

  • 您使用的是哪个 dbms?
  • @jarlh Microsoft SQL Server Management Studio
  • 我建议你不要。 T-SQL 的模块化功能非常有限。尝试应用其他语言中的“最佳实践”将导致困难。将此代码打包为内联表值函数(不​​是多语句函数!)与您将获得一个体面的解决方案一样接近,但这仍然不如在原始过程中扩展条件。 (有关完整故事,请参阅this。)
  • 为什么要写这样的代码?只需按原样执行DELETE。您尝试执行的操作将执行完全相同的查询两次

标签: sql-server tsql if-statement stored-procedures


【解决方案1】:

首先,您的存储过程应该返回值:

CREATE PROCEDURE SubjectExists @SubjName varchar(20)
AS
    BEGIN
    DECLARE @ReturnValue int

    SELECT @ReturnValue = CASE WHEN EXISTS(
        SELECT *
        FROM Subject 
        WHERE Subject_Name = @SubjName
        )
        THEN CAST (1 AS BIT)
        ELSE CAST (0 AS BIT)
        END

    RETURN @ReturnValue
    END

然后你可以声明一些表来存储你的存储过程的结果,如果它符合条件,然后运行你的代码

DECLARE @FooValue int;
EXEC  @FooValue = SubjectExists 'helloWorld!:)' 

IF  @FooValue = 1
    BEGIN
        DELETE FROM Subject 
        WHERE Subject_Name = @SubjName;
    END

【讨论】:

  • 在Subject Exists SPROC中,您输入的return语句(倒数第二行)会导致语法错误
  • @ReturnValue 在没有赋值的情况下如何工作?
  • @HABO 哎呀,感谢您的关注。我已经编辑了我的答案。
  • @StepUp RETURN @ReturnValue 有问题。放入时显示语法错误
  • @Sam 请看我更新的答案。
【解决方案2】:

你需要像这样从存储过程中获取返回值——

DECLARE @returnvalue INT

 EXEC @returnvalue = StudentExists Bob

然后你就可以设置If 条件了。

【讨论】:

  • 除了他的第一个存储过程没有返回值。
  • 我试过了,但还是不行,只是根据 SubjectExists 返回 0/1。 CREATE PROC AS DECLARE 'Exists int exec 'Exists = StudentExists 'StudName IF(@Exists= 1) DELETE FROM Student WHERE Student_Name = StudName ELSE PRINT NULL; //不让我把 at 符号放在所以我把 ' 代替
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
相关资源
最近更新 更多