gpt4 book ai didi

tsql - 存储过程中 END 后的语句

转载 作者:行者123 更新时间:2023-12-04 10:57:53 25 4
gpt4 key购买 nike

我今天遇到了一个有趣的问题。我正在更改一个存储过程并在最后放置一个 select 语句。它本来是临时的,仅用于处理数据。后来我惊讶地发现该语句已保存并在 SP 运行时正在执行。

SET ANSI_NULLS ON
GO

-- Comments usually go here and are saved as part of the SP
ALTER PROCEDURE [dbo].[MySP]
@param INT
AS
BEGIN
--Your normal SQL statements here
END

--You can also add SQL statements here
select * from LargeTable

--You have access to the params
select @param

保存所有内容是有道理的,而不仅仅是 BEGIN/END 中的内容,否则注释和 SET ANSI_NULLS等会消失。我对从哪里开始有点困惑,所以我有几个问题:
  • SET ANSI_NULLS保存为 SP 的一部分。我已经确认每个SP都有自己的值(value)。 SQL Server 怎么知道将它保存为 SP 的一部分,因为它以前没有被引用过?是否对当前环境状态进行全面扫描,然后当ALTER PROCEDURE运行它保存状态(可能只有非默认值)?
  • 显然 BEGIN/END 是可选的,没有内在意义。为什么他们甚至包括在内?它们给人一种不存在的虚假范围感。在我看来,没有 BEGIN/END 和最后的 GO 是最有意义的。
  • 最佳答案

    ANSI NULLS 和 QUOTED IDENTIFIERS 存储为存储过程代码的元数据属性。您可以通过以下方式查看这些设置

    select * from sys.sql_modules 

    保存过程时,这些属性将设置为用于保存过程的连接的任何属性。这可能会导致令人讨厌的不一致,所以要小心。

    至于 BEGIN/END,正如@bobs 所说——它们表示代码块,它们不表示存储过程代码的开始和结束。 (函数,是的,过程,不是。)正如你所说, no BEGIN/END and a GO at the end would make the most sense是我多年来一直这样做的方式。

    从技术上讲,SQL 将(尝试)将所有内容作为存储过程的一部分保存在一个批处理中——也就是说,您提交的所有文本都被 GO 语句(如果有的话)分解。如果您在临时查询之前插入了 RETURN 语句,它们将包含在代码中但永远不会运行。

    关于tsql - 存储过程中 END 后的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4188557/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com