Debian上SQL Server存储过程编写指南
一 环境准备与连接
- 安装 SQL Server for Linux(Debian 10/11/12 均可):
- 导入 GPG 密钥并注册 Microsoft APT 仓库(注意使用 Debian 的发行版代号),更新索引后安装包,运行配置向导并按提示设置 SA 密码,最后启动服务。
- 示例命令:
- wget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
- sudo add-apt-repository “$(wget -qO- https://packages.microsoft.com/config/debian/$(lsb_release -rs)/prod.list)”
- sudo apt-get update && sudo apt-get install -y mssql-server
- sudo /opt/mssql/bin/mssql-conf setup
- sudo systemctl restart mssql-server && sudo systemctl status mssql-server
- 连接数据库:
- 使用 sqlcmd 本地或远程连接:sqlcmd -S localhost -U SA -P ‘YourPassword’。在 sqlcmd 交互中可逐条执行 T‑SQL,也可通过 -i 执行脚本文件。
二 基本语法与最小示例
- 存储过程使用 T‑SQL 编写,常用模板:
- CREATE PROCEDURE [schema.]name
@Param1 datatype [= default] [OUTPUT],
@Param2 datatype [OUTPUT]
WITH { RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION }
AS
BEGIN
– 业务逻辑(SELECT/INSERT/UPDATE/DELETE、IF、TRY…CATCH 等)
END
GO
- 最小示例(无参查询):
- USE YourDatabaseName;
GO
CREATE PROCEDURE dbo.GetEmployees
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM dbo.Employees;
END
GO
– 执行
EXEC dbo.GetEmployees;
- 带参与输出示例:
- CREATE PROCEDURE dbo.GetEmployeeByID
@EmployeeID INT,
@FullName NVARCHAR(201) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @FullName = FirstName + N’ ’ + LastName
FROM dbo.Employees
WHERE EmployeeID = @EmployeeID;
END
GO
– 调用(声明变量接收 OUTPUT)
DECLARE @Name NVARCHAR(201);
EXEC dbo.GetEmployeeByID @EmployeeID = 1, @FullName = @Name OUTPUT;
SELECT @Name AS FullName;
- 要点
- 建议始终使用 dbo 架构或明确的 schema 前缀。
- 使用 SET NOCOUNT ON 减少网络流量与“影响行数”消息干扰。
- 参数支持 OUTPUT,可在调用端获取返回值。
三 参数与结果处理
- 参数要点
- 支持 默认值(常量或 NULL)、OUTPUT 返回参数;最多可定义 2100 个参数。
- 游标类型参数必须同时指定 VARYING 与 OUTPUT。
- 结果集与返回码
- 存储过程可返回多个结果集(多个 SELECT),也可通过 OUTPUT 参数返回标量值。
- 可使用 RETURN 整数作为过程返回码(0 通常表示成功),与 OUTPUT 参数互不冲突。
- 示例(返回码 + 输出参数 + 结果集)
-
CREATE PROCEDURE dbo.GetEmpInfo
@EmpID INT,
@DeptName NVARCHAR(100) OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SELECT @DeptName = d.Name
FROM dbo.Employees e
JOIN dbo.Departments d ON d.ID = e.DeptID
WHERE e.EmployeeID = @EmpID;
IF @DeptName IS NULL
RETURN 404; – 自定义“未找到”码
ELSE
RETURN 0; – 成功
END
GO
– 调用
DECLARE @Dept NVARCHAR(100), @RC INT;
EXEC @RC = dbo.GetEmpInfo @EmpID = 1, @DeptName = @Dept OUTPUT;
SELECT @RC AS ReturnCode, @Dept AS Department;
四 错误处理与最佳实践
- 错误处理
- 在 T‑SQL 中使用 TRY…CATCH 捕获异常,结合 THROW 或 RAISERROR 反馈错误;在 CATCH 中可通过 ERROR_MESSAGE()/ERROR_NUMBER()/ERROR_SEVERITY()/ERROR_STATE() 获取上下文信息,必要时回滚事务。
- 最佳实践
- 权限最小化:避免使用 SA,为应用创建专用登录与最小权限的数据库用户/角色。
- 命名与架构:统一使用 dbo 或项目约定 schema,命名清晰可读。
- 语句边界:在 sqlcmd 中使用 GO 分隔批处理;在 SSMS/其他客户端中同样适用。
- 工具与自动化:将建库、建表、存储过程等 DDL/DML 放入脚本,配合 sqlcmd -i 或 CI/CD 执行,便于版本化管理与回滚。