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 → 执行
相关推荐
zyseo86 小时前
谷歌SEO 准首页词挖掘脚本:找出排在第 8-20 名的隐藏流量
大数据·数据库·人工智能
xiaogai_gai8 小时前
仅查询策略实战:从金蝶云·星空旗舰版定时拉取收料通知单
大数据·数据库·python
数据工匠老o8 小时前
异构数据库DDL同步:260条链路的结构变更自动适配方案
数据库·架构
阿里云大数据AI技术9 小时前
StarRocks 与 Fluss 用一条 SQL 查实时与历史
人工智能·sql
这个DBA有点耶9 小时前
银行业市占率最高的国产数据库是谁?先搞清楚“市占率”的四种口径
数据库·程序员·架构
用户62799471826210 小时前
南大通用GBase 8a之基于审计日志的冷温热数据分析
数据库
数据库小学妹10 小时前
数据库运维五级成熟度:监控、备份、高可用怎么串起来
运维·数据库·监控
一个天蝎座的程序猿10 小时前
为了给报表提速,我把金仓KES的列存储折腾了个遍:聊聊KES的技术能力
数据库
飞越未来云城的霓虹飞猪10 小时前
AI 数据库地图:从 PostgreSQL 到向量数据库,一次看懂 AI 时代的数据底座
数据库
不像程序员的程序媛10 小时前
导出mysql数据结构
数据库·mysql