温馨提示×

Debian上SQL Server的存储过程编写指南是什么

小樊
31
2026-01-03 06:08:50
栏目: 云计算

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 个参数。
    • 游标类型参数必须同时指定 VARYINGOUTPUT
  • 结果集与返回码
    • 存储过程可返回多个结果集(多个 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 捕获异常,结合 THROWRAISERROR 反馈错误;在 CATCH 中可通过 ERROR_MESSAGE()/ERROR_NUMBER()/ERROR_SEVERITY()/ERROR_STATE() 获取上下文信息,必要时回滚事务。
  • 最佳实践
    • 权限最小化:避免使用 SA,为应用创建专用登录与最小权限的数据库用户/角色。
    • 命名与架构:统一使用 dbo 或项目约定 schema,命名清晰可读。
    • 语句边界:在 sqlcmd 中使用 GO 分隔批处理;在 SSMS/其他客户端中同样适用。
    • 工具与自动化:将建库、建表、存储过程等 DDL/DML 放入脚本,配合 sqlcmd -i 或 CI/CD 执行,便于版本化管理与回滚。

0