SQL Server在Ubuntu上的存储过程编写指南
导读:Ubuntu上使用SQL Server编写存储过程指南 一 环境准备与连接 安装 SQL Server for Linux(Ubuntu 18.04/20.04/22.04 等),完成 SA 密码设置与开机自启:导入 GPG 密钥、添加...
Ubuntu上使用SQL Server编写存储过程指南
一 环境准备与连接
- 安装 SQL Server for Linux(Ubuntu 18.04/20.04/22.04 等),完成 SA 密码设置与开机自启:导入 GPG 密钥、添加 Microsoft 仓库、安装 mssql-server、执行 sudo /opt/mssql/bin/sqlservr-setup、启动服务(sudo systemctl start mssql-server)。
- 安装命令行工具 mssql-tools 并加入 PATH,便于使用 sqlcmd 连接:sudo apt-get install -y mssql-tools unixodbc-dev;建议将 /opt/mssql-tools/bin 加入环境变量。
- 本地连接测试:sqlcmd -S localhost -U SA -P ‘YourStrong@Passw0rd’;远程连接将 localhost 替换为服务器 IP,并确保防火墙放行 1433/tcp(UFW:sudo ufw allow 1433/tcp)。
- 以上步骤完成后,即可在 Ubuntu 终端内使用 T‑SQL 管理数据库与存储过程。
二 基本语法与模板
- 基本模板(推荐始终加上 SET NOCOUNT ON; 以抑制“受影响的行数”消息):
CREATE OR ALTER PROCEDURE dbo.ProcedureName
@Param1 INT,
@Param2 NVARCHAR(50),
@OutputParam INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
-- 业务逻辑
SELECT @OutputParam = @Param1 * 2;
END
GO
- 执行与输出参数示例:
DECLARE @Result INT;
EXEC dbo.ProcedureName @Param1 = 5, @Param2 = N'hello', @OutputParam = @Result OUTPUT;
SELECT @Result AS Result;
- 修改与删除:
ALTER PROCEDURE dbo.ProcedureName ... ;
-- 修改
DROP PROCEDURE IF EXISTS dbo.ProcedureName;
-- 删除(SQL Server 2016+ 支持 IF EXISTS)
- 在 sqlcmd 中,使用 GO 分隔批处理;在客户端工具中通常不需要显式 GO。
三 常用示例
- 示例一 带输入与输出参数
CREATE OR ALTER PROCEDURE dbo.AddNumbers
@Number1 INT,
@Number2 INT,
@Sum INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET @Sum = @Number1 + @Number2;
END
GO
-- 调用
DECLARE @Res INT;
EXEC dbo.AddNumbers @Number1 = 5, @Number2 = 10, @Sum = @Res OUTPUT;
SELECT @Res AS Result;
- 示例二 查询并返回结果集
IF OBJECT_ID(N'dbo.GetEmployeesByDept', N'P') IS NOT NULL
DROP PROCEDURE dbo.GetEmployeesByDept;
GO
CREATE PROCEDURE dbo.GetEmployeesByDept
@DeptID INT
AS
BEGIN
SET NOCOUNT ON;
SELECT EmployeeID, Name, Title
FROM dbo.Employees
WHERE DepartmentID = @DeptID
ORDER BY EmployeeID;
END
GO
-- 调用
EXEC dbo.GetEmployeesByDept @DeptID = 1;
- 示例三 错误处理与事务
CREATE OR ALTER PROCEDURE dbo.TransferMoney
@FromAcc INT,
@ToAcc INT,
@Amount DECIMAL(18,2)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION;
UPDATE dbo.Accounts SET Balance = Balance - @Amount WHERE AccountID = @FromAcc;
IF @@ROWCOUNT = 0 THROW 50001, 'From account not found or insufficient funds.', 1;
UPDATE dbo.Accounts SET Balance = Balance + @Amount WHERE AccountID = @ToAcc;
IF @@ROWCOUNT = 0 THROW 50002, 'To account not found.', 1;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT >
0 ROLLBACK TRANSACTION;
DECLARE @ErrMsg NVARCHAR(4000) = ERROR_MESSAGE();
DECLARE @ErrSeverity INT = ERROR_SEVERITY();
DECLARE @ErrState INT = ERROR_STATE();
RAISERROR(@ErrMsg, @ErrSeverity, @ErrState);
END CATCH
END
GO
- 示例四 安全与权限
-- 创建登录与用户
CREATE LOGIN app_user WITH PASSWORD = 'StrongP@ssw0rd!';
CREATE USER app_user FOR LOGIN app_user;
-- 授予执行权限
GRANT EXECUTE ON dbo.GetEmployeesByDept TO app_user;
- 示例五 查看与修改
-- 查看定义
EXEC sp_helptext 'dbo.GetEmployeesByDept';
-- 修改
ALTER PROCEDURE dbo.GetEmployeesByDept
@DeptID INT
AS
BEGIN
SET NOCOUNT ON;
SELECT EmployeeID, Name, Title, HireDate
FROM dbo.Employees
WHERE DepartmentID = @DeptID
ORDER BY HireDate DESC;
END
GO
- 以上示例涵盖了输出参数、结果集、事务与错误处理、权限控制与对象维护,适合在 Ubuntu 终端通过 sqlcmd 直接运行。
四 在Ubuntu终端的最佳实践
- 使用 sqlcmd 执行脚本:将 T‑SQL 保存为文件(如 sp_Create.sql),在终端运行:sqlcmd -S localhost -U SA -P ‘’ -d YourDB -i sp_Create.sql -o sp_Create.out;生产环境建议使用专用低权限账户与最小权限原则。
- 在 sqlcmd 会话中,使用 GO 提交批处理;跨批定义/修改对象时尤为重要。
- 客户端选择:除 sqlcmd 外,可使用 Visual Studio Code + SQL Server (mssql) 扩展 或 SSMS 进行可视化开发与调试(SSMS 为 Windows 工具,可通过远程连接管理 Linux 上的 SQL Server)。
五 常见问题与排查
- 连接失败:确认 SQL Server 服务已启动(sudo systemctl status mssql-server)、监听 1433/tcp 已放行(UFW:sudo ufw allow 1433/tcp),并使用正确主机与端口(远程时将 localhost 改为服务器 IP)。
- 权限不足:创建/修改存储过程需要相应权限(如 CREATE PROCEDURE、ALTER ANY PROCEDURE),必要时使用 dbo 架构或授予 EXECUTE 权限给应用账户。
- 批处理分隔:在 sqlcmd 中忘记 GO 会导致语法错误或对象未创建,遇到“命令已终止”时优先检查批处理边界。
- 大小写与架构:Linux 上 SQL Server 默认区分大小写取决于排序规则;建议使用显式架构(如 dbo.ProcName)避免解析歧义。
- 工具路径:若 sqlcmd 不可用,检查 /opt/mssql-tools/bin 是否在 PATH 中,或重新安装 mssql-tools。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: SQL Server在Ubuntu上的存储过程编写指南
本文地址: https://pptw.com/jishu/754791.html
