在 'AS' 之前或之后声明变量有什么区别?

What's the difference between declaring the variable before or after 'AS'?

我发现我朋友的查询是这样的。

SET QUOTED_IDENTIFIER ON

GO
ALTER  PROCEDURE [dbo].[GetEmployeeTakeHomePay]
    @erCode VARCHAR(50) ,
    @payCycCode VARCHAR(50) ,
    @pyYear SMALLINT ,
    @pyMonth TINYINT ,
    @pyPrd SMALLINT ,
    @seq INT
AS 
    DECLARE @prdStartDate DATETIME
    BEGIN

    SELECT TOP 0
            *
    INTO    #molohok
    FROM    dbo.PYTRX_TakeHomePayWorkfile
    WHERE   ErCode = @erCode
            AND PayCycCode = @payCycCode
            AND PYYear = @pyYear
            AND PYMonth = @pyMonth
            AND PYPrd = @pyPrd
            AND Seq = @seq

'AS'前后也有变数。在'AS'之前和之后声明变量有什么区别?

参数在AS之前,变量在AS之后的声明体中

ALTER  PROCEDURE [dbo].[GetEmployeeTakeHomePay]
    <procedure parameters>
AS 
    <local variables>

see official documentation

as 之前的“变量”是存储过程的参数。

参数是调用存储过程时提供的“变量”。所以这个存储过程需要六个参数。参数可以是可选的。

as后面的“变量”声明为局部变量,供存储过程运行时使用。实际上,declare可以用在任何编程块中。

请注意,一个存储过程可以接受多个语句。但是,我 总是 将存储过程的主体放在它自己的 begin/end 块中。我还在过程的参数周围加上了括号。

所以,我会这样写:

ALTER PROCEDURE [dbo].GetEmployeeTakeHomePay (
    @erCode VARCHAR(50) ,
    @payCycCode VARCHAR(50) ,
    @pyYear SMALLINT ,
    @pyMonth TINYINT ,
    @pyPrd SMALLINT ,
    @seq INT
) AS 
BEGIN
    DECLARE @prdStartDate DATETIME;

    . . . 
END;  -- GetEmployeeTakeHomePay