SQL Server 存储过程变量详解:声明、赋值与 SET/SELECT 区别

林舟
林舟
发布时间:2026-10-14 | 6人浏览过
原创

在 SQL Server 存储过程中,变量是保存临时数据的关键。本文将详细讲解如何使用 DECLARE 声明局部变量,以及 SET 和 SELECT 两种赋值方式的具体用法和核心区别,并通过用户登录校验的实际案例,帮助开发者掌握变量在存储过程中的高效应用。

存储过程变量的基础概念

SQL 中的变量主要分为局部变量和全局变量。局部变量由用户定义,以单个 @ 开头(如 @Local_Var);全局变量通常由系统内部维护,以双 @@ 开头。在编写存储过程时,我们主要关注局部变量的使用。

变量的声明与赋值

第1步:使用 DECLARE 声明变量

目的:在 SQL 中定义并分配内存给一个变量。

入口:存储过程体内部。

动作:使用 DECLARE 关键字后跟变量名和数据类型。

参数:支持 int, varchar, decimal, float, text 等常见数据类型。

完成状态:变量可用,但初始值为 NULL。

复制代码
-- 正确声明语法
DECLARE @ID VARCHAR(20);
-- SQL Server 支持在声明时直接赋值(需注意顺序)
DECLARE @Name VARCHAR(20) = 'Alice';

第2步:使用 SET 或 SELECT 进行赋值

目的:将具体数值或查询结果赋予已声明的变量。

操作方式:主要有两种方式:SET 和 SELECT。

基本用法示例:

-- 初始化变量
DECLARE @ID INT;

-- 使用 SET 赋值
SET @ID = 3;
PRINT @ID; -- 输出: 3

-- 使用 SELECT 赋值
SELECT @ID = 5;
PRINT @ID; -- 输出: 5

运算支持:赋值同时可以进行简单的数学运算。

DECLARE @Num INT;
SET @Num = 10;

-- 加法
SELECT @Num = @Num + 5;    -- 15
-- 乘法
SELECT @Num = @Num * 2;    -- 30
-- 模运算 (取余)
SELECT @Num = @Num % 4;    -- 2

SET 与 SELECT 赋值的区别

虽然两者都能用于赋值,但在处理查询结果时的行为截然不同,理解这些差异对于编写健壮的存储过程至关重要。

区别1:表达式返回多个值时

  • SET:如果子查询返回多行数据,执行会立即报错(消息 512),因为它期望单一的标量值。
  • SELECT:不会报错,但会将结果集中的最后一行对应列的值赋给变量,之前的赋值会被覆盖。

区别2:表达式未返回值时

  • SET:如果查询没有匹配到任何记录(返回 NULL),变量将被显式赋值为 NULL。
  • SELECT:如果查询没有匹配到记录,变量保持赋值前的原值不变,静默跳过。
条件 SET 行为 SELECT 行为
返回多行 抛出错误 取最后一行值
无返回值 赋值为 NULL 保持原值

综合实战:登录校验存储过程

下面是一个利用变量实现用户登录校验的存储过程示例。它演示了如何通过 SELECT 获取密码并判断权限,同时使用输出参数返回结果。

CREATE PROCEDURE UserLogin_Check
    @name VARCHAR(20),
    @password VARCHAR(20),
    @inReturn INT OUTPUT       -- 输出参数
AS
BEGIN
    -- 定义变量保存数据库中的真实密码
    DECLARE @strPwd VARCHAR(20);

    -- 使用 SELECT 赋值
    -- 注意:这里假设用户名唯一,若有多行会取最后一行
    SELECT @strPwd = userPass 
    FROM userinfo 
    WHERE userName = @name;

    -- 判断密码是否一致且变量不为空
    IF (@strPwd IS NOT NULL AND @strPwd = @password)
    BEGIN
        SET @inReturn = 1;            -- 登录成功
        -- 可选:更新最后登录时间
        UPDATE userinfo 
        SET registertime = GETDATE() 
        WHERE userName = @name;
    END
    ELSE
    BEGIN
        SET @inReturn = -1;           -- 用户名错误或密码错误
    END
END
GO

调用测试:

DECLARE @result INT;

-- 调用带输出参数的存储过程
EXEC UserLogin_Check 
    @name = 'admin',
    @password = 'secret_pwd',
    @inReturn = @result OUTPUT;

PRINT @result; -- 根据情况输出 1 或 -1

以上就是关于 SQL Server 存储过程变量声明、赋值及区别的详细内容,更多关于 SQL 存储过程优化的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表