SQL存储过程中AS前后声明变量有什么区别?
存储过程AS前后参数与局部变量的核心区别
嘿,这个问题问得很到位!先给你把AS前后的两个“变量”分清楚——其实AS前面的是存储过程的输入参数,AS后面用DECLARE声明的是局部变量,两者在本质上完全不同,具体区别我拆成几个点给你讲明白:
定位与用途差异
- AS前面的参数是存储过程对外的"接口",专门用来接收外部调用者传递的输入信息。比如你例子里的
@erCode、@payCycCode这些,都是调用这个存储过程时必须(除非设置了默认值)传入的查询条件,是外部和存储过程交互的通道。 - AS后面的局部变量是存储过程内部的"临时容器",只服务于过程内部的逻辑,用来存中间计算结果、临时数据或者辅助判断,比如你的
@prdStartDate,外部调用者根本看不到它,也不需要关心它的存在。
- AS前面的参数是存储过程对外的"接口",专门用来接收外部调用者传递的输入信息。比如你例子里的
作用域范围不同
- 存储过程参数的作用域覆盖整个存储过程,从AS开始的所有主体代码都能直接引用它,甚至如果后续调用嵌套存储过程,还可以把它作为参数传递过去。
- 局部变量的作用域是从
DECLARE声明的位置开始,到存储过程结束为止;如果是在某个BEGIN/END代码块里声明的,那作用域就仅限这个块内部,出了块就没法用了。
定义语法不一样
- 参数是紧跟在存储过程名称后面定义的,不需要
DECLARE关键字,格式是@参数名 数据类型 [=默认值],比如@erCode VARCHAR(50),还可以给参数加默认值,比如@pyPrd SMALLINT = 1,这样调用时就可以省略这个参数。 - 局部变量必须用
DECLARE关键字声明,格式是DECLARE @变量名 数据类型,还可以一次性声明多个变量,比如DECLARE @a INT, @b DATE,声明后需要用SET或者SELECT来赋值。
- 参数是紧跟在存储过程名称后面定义的,不需要
赋值方式有区别
- 参数的值是在调用存储过程时传入的,比如执行
EXEC [dbo].[GetEmployeeTakeHomePay] 'ER001', 'MONTHLY', 2024, 5, 1, 1,就是把对应的值传给各个参数;如果参数有默认值,调用时可以不传,会自动用默认值。 - 局部变量得在声明后手动赋值,比如
SET @prdStartDate = '2024-05-01',或者通过查询赋值:SELECT @prdStartDate = PrdStart FROM dbo.PY_Periods WHERE ErCode = @erCode AND ...。
- 参数的值是在调用存储过程时传入的,比如执行
举个直观的例子:你调用这个存储过程的时候,只需要管@erCode到@seq这几个参数,@prdStartDate是存储过程自己内部用的临时变量,你既不用给它传值,也没法直接修改它,完全是过程内部的逻辑细节。
内容的提问来源于stack exchange,提问作者riachan
相关产品推荐
相关产品推荐

