在 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;
,它本身就够令人困惑的了。
我发现您可以在 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;
,它本身就够令人困惑的了。