温馨提示×

Ubuntu SQL Server存储过程编写指南

小樊
43
2025-10-13 19:13:41
栏目: 云计算

Ubuntu SQL Server存储过程编写指南

1. 准备工作:安装与连接

在Ubuntu上编写存储过程前,需先完成SQL Server的安装与基础配置:

  • 安装SQL Server:按照Microsoft官方文档,在Ubuntu终端执行无人值守安装脚本(如sudo apt-get install -y mssql-server),并通过sudo /opt/mssql/bin/mssql-conf setup配置SA密码及实例选项。
  • 连接SQL Server:使用sqlcmd命令行工具连接本地实例,命令格式为sqlcmd -S localhost -U SA -P <YourStrongPassword>(替换为实际密码)。
  • 创建数据库与表:若需测试,可创建数据库(CREATE DATABASE TestDB; GO)并切换(USE TestDB; GO),再创建示例表(如Employees表:CREATE TABLE Employees (EmployeeID INT PRIMARY KEY IDENTITY(1,1), Name NVARCHAR(50), Department NVARCHAR(50)); GO)。

2. 存储过程基本语法

SQL Server存储过程的核心语法结构如下:

CREATE PROCEDURE ProcedureName
    @Parameter1 DataType [= DefaultValue],  -- 输入参数(可选默认值)
    @Parameter2 DataType OUTPUT              -- 输出参数(需显式声明)
AS
BEGIN
    SET NOCOUNT ON;  -- 关闭受影响行数的返回,提升性能
    -- 业务逻辑SQL语句(如SELECT、INSERT、UPDATE等)
END;
GO
  • 关键说明
    • @Parameter1:输入参数,调用时需提供值;
    • @Parameter2 OUTPUT:输出参数,调用后需通过变量接收返回值;
    • SET NOCOUNT ON:避免返回“n rows affected”消息,减少网络传输量。

3. 常见存储过程示例

3.1 基础查询存储过程

功能:根据部门名称查询员工信息。

CREATE PROCEDURE GetEmployeesByDepartment
    @DepartmentName NVARCHAR(50)
AS
BEGIN
    SELECT EmployeeID, Name, Department
    FROM Employees
    WHERE Department = @DepartmentName;
END;
GO

调用方式

EXEC GetEmployeesByDepartment @DepartmentName = 'Sales';

3.2 带输出参数的存储过程

功能:获取指定部门的员工数量。

CREATE PROCEDURE GetEmployeeCountByDepartment
    @DepartmentName NVARCHAR(50),
    @EmployeeCount INT OUTPUT
AS
BEGIN
    SELECT @EmployeeCount = COUNT(*)
    FROM Employees
    WHERE Department = @DepartmentName;
END;
GO

调用方式

DECLARE @Count INT;
EXEC GetEmployeeCountByDepartment @DepartmentName = 'Sales', @EmployeeCount = @Count OUTPUT;
PRINT 'Sales部门员工数量:' + CAST(@Count AS NVARCHAR(10));

3.3 带条件逻辑的存储过程

功能:更新员工薪资,包含异常处理(如员工不存在、涨幅过大)。

CREATE PROCEDURE UpdateEmployeeSalary
    @EmployeeID INT,
    @SalaryIncrease DECIMAL(10,2)
AS
BEGIN
    DECLARE @CurrentSalary DECIMAL(10,2);
    
    -- 检查员工是否存在
    SELECT @CurrentSalary = Salary
    FROM Employees
    WHERE EmployeeID = @EmployeeID;
    
    IF @CurrentSalary IS NULL
    BEGIN
        RAISERROR('员工ID %d 不存在', 16, 1, @EmployeeID);
        RETURN;
    END
    
    -- 检查涨幅是否合法
    IF @SalaryIncrease > 10000
    BEGIN
        RAISERROR('薪资涨幅不能超过10000', 16, 1);
        RETURN;
    END
    
    -- 更新薪资
    UPDATE Employees
    SET Salary = Salary + @SalaryIncrease
    WHERE EmployeeID = @EmployeeID;
END;
GO

调用方式

EXEC UpdateEmployeeSalary @EmployeeID = 1, @SalaryIncrease = 5000;

4. 存储过程的管理操作

4.1 修改存储过程

使用ALTER PROCEDURE修改现有存储过程的逻辑(如调整查询条件、更新参数):

ALTER PROCEDURE GetEmployeesByDepartment
    @DepartmentName NVARCHAR(50)
AS
BEGIN
    SELECT EmployeeID, Name, Department, Salary  -- 新增Salary字段
    FROM Employees
    WHERE Department = @DepartmentName
    ORDER BY Name;  -- 新增排序
END;
GO

4.2 删除存储过程

使用DROP PROCEDURE删除不再需要的存储过程(若存储过程不存在,可添加IF EXISTS避免报错):

DROP PROCEDURE IF EXISTS GetEmployeesByDepartment;
GO

5. 注意事项

  • 权限控制:确保当前用户对目标数据库有CREATE PROCEDURE(创建)、ALTER(修改)、EXECUTE(执行)等权限。
  • 参数一致性:调用存储过程时,输入参数的数量、数据类型需与定义一致;输出参数需用OUTPUT关键字标记,并通过变量接收返回值。
  • 性能优化:合理使用SET NOCOUNT ON、索引及条件过滤,避免全表扫描;复杂逻辑可拆分为多个存储过程,提高可维护性。
  • 错误处理:通过TRY...CATCH块捕获异常(如BEGIN TRY...END TRYBEGIN CATCH...END CATCH),提升存储过程的健壮性(示例略)。

0