SQL Server 存储过程语法整理

一、存储过程标准完整语法

sql 复制代码
-- =============================================
-- 创建/修改存储过程
-- =============================================
CREATE OR ALTER PROCEDURE 存储过程名
    @参数1  数据类型 = 默认值,
    @参数2  数据类型 = 默认值 OUTPUT,  -- 输出参数
    @参数3  VARCHAR(50) = ''
AS
BEGIN
    -- 关闭计数返回,避免干扰结果
    SET NOCOUNT ON;

    -- =============================================
    -- 变量定义
    -- =============================================
    DECLARE @变量1 INT;
    DECLARE @变量2 VARCHAR(100) = '默认值';
    DECLARE @日期 DATE = GETDATE();

    -- =============================================
    -- 事务(需要保证原子操作时用)
    -- =============================================
    BEGIN TRY
        BEGIN TRANSACTION;

        -- 业务逻辑 SQL
        -- 增删改查...

        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        -- 出错回滚
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION;

        -- 抛出错误信息
        THROW;
    END CATCH;

    -- =============================================
    -- 返回结果
    -- =============================================
    SELECT * FROM 表名;
END;
GO

二、核心语法拆解(必记)

1. 创建 / 修改

sql 复制代码
CREATE PROCEDURE 名称    -- 新建
ALTER PROCEDURE 名称     -- 修改
CREATE OR ALTER 名称     -- 有则改,无则建(SQL2016+)

2. 参数

  • 输入参数:@id INT
  • 带默认值:@id INT = 0
  • 输出参数:@总数量 INT OUTPUT
  • 多个参数用逗号分隔

3. 变量声明

sql 复制代码
DECLARE @名称 类型;
DECLARE @名称 类型 = 初始值;

4. SET NOCOUNT ON

必须写 ,否则会多返回一行 影响xx行,容易导致程序报错。

5. 事务(增删改必用)

sql 复制代码
BEGIN TRANSACTION;  -- 开始
COMMIT;             -- 提交
ROLLBACK;           -- 回滚

6. 异常捕获 TRY/CATCH

sql 复制代码
BEGIN TRY
END TRY
BEGIN CATCH
END CATCH

7. 执行存储过程

sql 复制代码
EXEC 存储过程名 @参数1=1, @参数2='abc';

三、最常用完整模板(直接复制改表名就能用)

sql 复制代码
CREATE OR ALTER PROCEDURE USP_查询产品列表
    @产品类型 VARCHAR(20) = '',
    @总数量 INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @当前日期 DATE = GETDATE();

    SELECT *
    FROM 产品表
    WHERE 类型 = @产品类型;

    -- 给输出参数赋值
    SELECT @总数量 = COUNT(*) FROM 产品表 WHERE 类型 = @产品类型;
END;
GO

调用:

sql 复制代码
DECLARE @总数量 INT;
EXEC USP_查询产品列表 @产品类型='手机', @总数量 = @总数量 OUTPUT;
SELECT @总数量;

四、存储过程里常用语法

1. 判断 IF

sql 复制代码
IF @参数 IS NULL
BEGIN
    PRINT '参数为空';
END
ELSE
BEGIN
    PRINT '参数有效';
END

2. 循环 WHILE

sql 复制代码
DECLARE @i INT = 1;
WHILE @i <= 10
BEGIN
    PRINT @i;
    SET @i = @i + 1;
END

3. 临时表 / 表变量

sql 复制代码
-- 表变量
DECLARE @表 TABLE(id INT, name VARCHAR(50));

-- 临时表
CREATE TABLE #临时表(id INT);

4. 分页写法

sql 复制代码
SELECT *
FROM 表
ORDER BY id
OFFSET (@页码-1)*@每页条数 ROWS
FETCH NEXT @每页条数 ROWS ONLY;

5. 分组、排序

sql 复制代码
SELECT 部门, SUM(金额) AS 合计
FROM 表
GROUP BY 部门
HAVING SUM(金额) > 1000
ORDER BY 合计 DESC;

五、简单总结(秒懂版)

  • CREATE PROC → 创建存储过程
  • @参数 → 传入条件
  • DECLARE → 定义内部变量
  • SET NOCOUNT ON → 避免多余返回信息
  • BEGIN/END → 代码块
  • TRY/CATCH → 异常处理
  • 事务 → 增删改不出错
  • EXEC → 执行
相关推荐
运维行者_3 小时前
Applications Manager中的Redis监控
大数据·服务器·数据库·人工智能·网络协议
悦数图数据库6 小时前
图数据库选型指南 2026:从架构、性能、AI 适配三个维度看 悦数科技
数据库·人工智能·架构
handler017 小时前
【MySQL】常用命令总结(库与表增删查改)
运维·数据库·mysql·命令·总结
week@eight7 小时前
Linux - Doris
linux·运维·数据库·mysql
cdbqss18 小时前
VB2026 菜单生成基类 BqGetMenuStrip
数据库·经验分享·学习·oracle·vb
洛水水8 小时前
Redis 分布式锁详解:实现与缺陷
数据库·redis·分布式
韶博雅8 小时前
oracle中表和列转大写
数据库·oracle
暴躁小师兄数据学院9 小时前
【AI大数据工程师特训笔记】第04讲:PostgreSQL 数据库内置函数详解
大数据·数据库·笔记·ai·语言模型
苏渡苇10 小时前
Spring Cloud Alibaba:将 Sentinel 熔断限流规则持久化到 Nacos 配置中心
数据库·spring boot·mysql·spring cloud·nacos·sentinel·持久化