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 → 执行
相关推荐
麦聪聊数据18 小时前
数据服务化时代:企业数据能力输出的核心路径
数据库
shushangyun_18 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
DARLING Zero two♡19 小时前
【MySQL数据库】数据类型与表约束
数据库·mysql
曹牧19 小时前
Oracle EXPLAIN PLAN
数据库·oracle
BD_Marathon19 小时前
SQL学习指南——视图
数据库·sql
活宝小娜19 小时前
mysql详细安装教程
数据库·mysql·adb
贤时间19 小时前
codex 助力oracle ebs 开发
数据库·oracle
秉承初心20 小时前
PostgreSQL 数据性能瓶颈突破实战
数据库·postgresql·oracle
2601_9620725520 小时前
李梦娇常识4600问|题库|打印版
sql·华为od·华为·c#·华为云·.net·harmonyos