【问题标题】:Are statements after END in stored procedure executed?存储过程中END之后的语句是否执行?
【发布时间】:2011-10-10 23:11:58
【问题描述】:

存储过程中END后的语句是否执行?

我发现我的一个存储过程在 BEGIN/END 块之后包含一个删除过程。但是,每次我在代码的其他地方执行存储过程时,它似乎都可以正常工作并且 pvd_sp_yyy 不会被删除。我不确定为什么?我首先担心这一点,所以无论如何我都会删除附加声明。

有人对此有任何想法吗?

谢谢

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


ALTER PROCEDURE [dbo].[pvd_xxx]
    @var
AS

BEGIN

    DECLARE @RETURN int

    SET @RETURN = 0

    IF EXISTS (
        SELECT * FROM table1
        WHERE name = @var
    )
    BEGIN
        SET @RETURN = 1
    END

    RETURN @RETURN

END


IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[pvd_sp_yyy]') AND type in (N'P', N'PC'))
    DROP PROCEDURE [pvd_sp_yyy]

【问题讨论】:

  • 我不想包含 drop 过程语句。这是一个错误,所以我将其删除。 1.我想澄清一下它是否会被执行。其他人似乎表明它可能? 2. 另外,为了防止我犯同样的错误,我应该总是在 END 后面加上一个 GO 吗?
  • 我很感兴趣 - 你有没有发现为什么第二个 proc 没有被丢弃? (按照您的代码编写方式,IF EXISTS ... DROP ... 代码肯定会在每次执行时被调用...)

标签: .net sql sql-server-2005 sql-server-2008


【解决方案1】:

BEGIN/END 不是存储过程的限制。批次结束(通常是 GO)是。

所以,是的,代码被执行了。

这也意味着 BEGIN/END 是不必要的......就像参数周围的括号一样。这是 SQL:不是高级客户端语言。

我经常在存储过程中留下一个 GRANT EXECUTE... :)

【讨论】:

  • 我不想包含 drop 过程语句。这是一个错误,所以我将其删除。 1.我想澄清一下它是否会被执行。你似乎表明它可能? 2. 另外,为了防止我犯同样的错误,我应该总是在 END 后面加上一个 GO 吗?
【解决方案2】:

是的,正如您所声明的只是一个代码块。程序内容在您输入 GO 执行批处理之前不会结束。

【讨论】:

    【解决方案3】:

    如果您确实希望执行 DROP PROCEDURE,那么它必须是批处理中的唯一语句,因此请使用 GO 分隔您的 ALTER PROCEDUREDROP PROCEDURE

    【讨论】:

      猜你喜欢
      • 2014-12-01
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 2013-01-27
      • 1970-01-01
      • 2018-08-26
      相关资源
      最近更新 更多