在Ubuntu上编写存储过程前,需先完成SQL Server的安装与基础配置:
sudo apt-get install -y mssql-server),并通过sudo /opt/mssql/bin/mssql-conf setup配置SA密码及实例选项。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)。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”消息,减少网络传输量。功能:根据部门名称查询员工信息。
CREATE PROCEDURE GetEmployeesByDepartment
@DepartmentName NVARCHAR(50)
AS
BEGIN
SELECT EmployeeID, Name, Department
FROM Employees
WHERE Department = @DepartmentName;
END;
GO
调用方式:
EXEC GetEmployeesByDepartment @DepartmentName = 'Sales';
功能:获取指定部门的员工数量。
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));
功能:更新员工薪资,包含异常处理(如员工不存在、涨幅过大)。
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;
使用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
使用DROP PROCEDURE删除不再需要的存储过程(若存储过程不存在,可添加IF EXISTS避免报错):
DROP PROCEDURE IF EXISTS GetEmployeesByDepartment;
GO
CREATE PROCEDURE(创建)、ALTER(修改)、EXECUTE(执行)等权限。OUTPUT关键字标记,并通过变量接收返回值。SET NOCOUNT ON、索引及条件过滤,避免全表扫描;复杂逻辑可拆分为多个存储过程,提高可维护性。TRY...CATCH块捕获异常(如BEGIN TRY...END TRY与BEGIN CATCH...END CATCH),提升存储过程的健壮性(示例略)。