在 AS 或 BEGIN 之后声明带有变量的存储过程

Declaring stored procedures with variables after AS or after BEGIN

我发现您可以在 AS 之后和 BEGIN 之后为存储过程声明工作变量。例如:

Create Procedure pr_DoAnUpdate 
  (@psInputString varchar(60))
As
Declare @sSomeVariable varchar(10);
Begin
  Do the update
End

Create Procedure pr_DoAnUpdate 
  (@psInputString varchar(60))
As
Begin
  Declare @sSomeVariable varchar(10);

  Do the update
End

我的问题是,是否有任何标准规定它应该去哪里,或者在以任何一种方式进行时是否有任何性能问题需要考虑?

看起来 SQL 服务器确实允许这样做。其他数据库根本不允许这样做(例如 Oracle)。

在SQL服务器中,一个存储过程声明为CREATE PROCEDURE [parameters] AS [body],其余部分为[body]。您通常看到的 BEGIN/END 只是为了展示,它无论如何都是一个语句块。这是许多错误的来源:

CREATE PROCEDURE InsertStuff(@Name NVARCHAR(10)) AS
BEGIN
    INSERT Stuff(Name) VALUES (@Name);
END;

-- remove test data
TRUNCATE TABLE Stuff;

如果您认为只是创建了一个存储过程然后截断了一个 table,那您就错了。相反,您只是创建了一个截断 table 的存储过程,因为它已成为正文的一部分。哎呀

您提到的两种形式在功能上是等价的。执行时间也没有区别。不过,为了理智起见,您应该坚持使用 AS BEGIN; [statements] END;,它本身就够令人困惑的了。