一、存储过程标准完整语法
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→ 执行