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 → 执行
相关推荐
MatrixOrigin13 分钟前
数据库没有死,只是范式变了
数据库·oracle
羊小蜜.1 小时前
Mysql 13: 触发器全解——创建、查看、使用与注意事项
数据库·mysql·触发器
阿里加多2 小时前
第 1 章:Go 并发编程概述
java·开发语言·数据库·spring·golang
ShiJiuD6668889992 小时前
Mysql 进阶
数据库·mysql
一 乐2 小时前
物流信息管理|基于springboot + vue物流信息管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·物流信息管理系统
Rick19932 小时前
Redis 分布式锁:核心使用场景
数据库·redis·分布式
身如柳絮随风扬4 小时前
Redis如何实现高效插入大量数据
数据库·redis·缓存
Dream of maid4 小时前
Mysql(3)运算符
数据库·mysql·adb