ToB企服应用市场:ToB评测及商务社交产业平台

标题: SQL Server数据库存储过程 [打印本页]

作者: 天空闲话    时间: 2024-10-2 07:18
标题: SQL Server数据库存储过程
SQL Server 中的存储过程(Stored Procedure)是一组为了完成特定功能的 SQL 语句集合,这些语句被编译并存储在数据库中,用户可以通过指定存储过程的名字和参数(假如有的话)来实行它。存储过程可以提高性能、简化复杂的操纵、减少网络流量以及提供安全性。

一、存储过程的类型

1、系统存储过程 (System Stored Procedures)


2、用户定义的存储过程 (User-Defined Stored Procedures)


3、扩展存储过程 (Extended Stored Procedures)


二、存储过程的优点

1.性能提拔


2.代码重用


3.安全性


4.简化网络流量


5.维护方便


6.事务处置处罚


7.自动化


三、存储过程的语法

1. 简单的存储过程(无参数)

  1. CREATE PROCEDURE ProcedureName -- ProcedureName为存储过程名称
  2. AS  
  3. BEGIN  
  4.     -- SQL语句  
  5.     SELECT * FROM YourTableName  --YourTableName为你的表名
  6. END
复制代码
2. 带输入参数的存储过程

  1. CREATE PROCEDURE ProcedureName -- ProcedureName为存储过程名
  2.     @ParameterName DataType, -- 例如 @ID INT ,这里填变量名和变量数据类型
  3.     @AnotherParameterName DataType -- 例如 @Name NVARCHAR(50)  
  4. AS  
  5. BEGIN  
  6.     -- SQL语句,使用参数  
  7.     SELECT * FROM YourTableName WHERE ID = @ID AND Name = @Name  
  8. END
复制代码
3. 带输出参数的存储过程

  1. CREATE PROCEDURE ProcedureName  
  2.     @InputParameter INT,  
  3.     @OutputParameter INT OUTPUT  
  4. AS  
  5. BEGIN  
  6.     -- SQL语句,设置输出参数的值  
  7.     SELECT @OutputParameter = SomeColumn  
  8.     FROM YourTableName  
  9.     WHERE AnotherColumn = @InputParameter  
  10. END
复制代码
在调用带输出参数的存储过程时,你需要声明一个变量来接收输出参数的值:
  1. DECLARE @MyOutput INT  
  2. EXEC ProcedureName @InputParameter = 1, @OutputParameter = @MyOutput OUTPUT  
  3. SELECT @MyOutput AS OutputValue
复制代码
4. 使用RETURN值的存储过程

存储过程还可以使用RETURN语句返回一个整数值,这通常用于指示存储过程的乐成或失败。但是,请留意,这与输出参数差别,因为RETURN值只能是一个整数,而且你不能从存储过程外部直接访问它(除非你在应用步调代码中捕获它)。
  1. CREATE PROCEDURE ProcedureName  
  2.     @ParameterName INT  
  3. AS  
  4. BEGIN  
  5.     IF EXISTS (SELECT 1 FROM YourTableName WHERE ID = @ParameterName)  
  6.         RETURN 0 -- 成功  
  7.     ELSE  
  8.         RETURN -1 -- 失败  
  9. END
复制代码
5. 使用TRY...CATCH的存储过程(错误处置处罚)

你可以在存储过程中使用TRY...CATCH块来处置处罚错误:
  1. CREATE PROCEDURE ProcedureName  
  2.     @ParameterName INT  
  3. AS  
  4. BEGIN  
  5.     BEGIN TRY  
  6.         -- 可能会引发错误的SQL语句  
  7.         -- ...  
  8.     END TRY  
  9.     BEGIN CATCH  
  10.         -- 处理错误的代码  
  11.         -- ...  
  12.     END CATCH  
  13. END
复制代码
四、调用存储过程

要调用存储过程,你可以使用EXEC或EXECUTE关键字:
  1. EXEC ProcedureName -- 无参数  
  2. EXEC ProcedureName @ParameterName = 1, @AnotherParameterName = 'Value' -- 带参数
复制代码
大概,假如存储过程没有参数或你想按参数顺序传递它们,你可以省略参数名:
  1. EXEC ProcedureName 1, 'Value' -- 假设这是按参数定义的顺序
复制代码
五、存储过程实例

1、不带参数的存储过程

以下是一个简单的存储过程,它从一个名为Employees的表中检索全部员工的姓名和年事:
  1. USE YourDatabaseName;  -- 替换为您的数据库名称  
  2. GO  
  3.   
  4. CREATE PROCEDURE GetAllEmployees  
  5. AS  
  6. BEGIN  
  7.     -- 设置NOCOUNT为ON,以减少不必要的返回消息  
  8.     SET NOCOUNT ON;  
  9.   
  10.     -- 查询Employees表并返回结果  
  11.     SELECT EmployeeName, Age  
  12.     FROM Employees;  
  13. END  
  14. GO
复制代码
要使用此存储过程,您只需在SQL Server Management Studio (SSMS) 或其他支持SQL的客户端中使用语言调用:
  1. EXEC GetAllEmployees;
复制代码
这将返回Employees表中全部员工的姓名和年事。
请留意,您需要确保YourDatabaseName和Employees表以及EmployeeName和Age列的名称与您的实际数据库和表结构相匹配。此外,假如您的Employees表包含敏感信息或大量数据,请确保在生产环境中谨慎使用此存储过程。
2、带输入参数的存储过程

假设我们有一个名为Employees的表,它有一个EmployeeID列和一个EmployeeName列。我们可以创建一个存储过程,该过程担当一个EmployeeID作为输入参数,并返回相应的EmployeeName。
  1. CREATE PROCEDURE GetEmployeeNameByID  
  2.     @EmployeeID INT  
  3. AS  
  4. BEGIN  
  5.     -- 设置NOCOUNT为ON,以阻止SQL Server发送额外的DONE_IN_PROC消息  
  6.     -- 这通常用于提高性能  
  7.     SET NOCOUNT ON;  
  8.   
  9.     -- 从Employees表中检索与给定EmployeeID关联的员工名称  
  10.     SELECT EmployeeName  
  11.     FROM Employees  
  12.     WHERE EmployeeID = @EmployeeID;  
  13. END;  
  14. GO
复制代码
可以通过以下方式调用它:
  1. EXEC GetEmployeeNameByID @EmployeeID = 1;  -- 假设你要查找ID为1的员工
复制代码
这将返回ID为1的员工的名称(假如存在于Employees表中)。假如表中没有与给定ID匹配的行,则查询将不返回任何结果。
3. 带输出参数的存储过程

  1. CREATE PROCEDURE GetEmployeeCount
  2.     @DepartmentID INT,
  3.     @EmployeeCount INT OUTPUT
  4. AS
  5. BEGIN
  6.     SET NOCOUNT ON;
  7.     SELECT @EmployeeCount = COUNT(*)
  8.     FROM Employees
  9.     WHERE DepartmentID = @DepartmentID;
  10.     -- 输出参数的值将在存储过程执行完成后返回给调用者
  11. END;
复制代码
在这个存储过程中:

你可以通过以下方式调用这个存储过程,并获取输出参数的值:
  1. DECLARE @DepartmentID INT = 1; -- 设置部门ID
  2. DECLARE @EmployeeCount INT; -- 声明输出参数
  3. EXEC GetEmployeeCount @DepartmentID, @EmployeeCount OUTPUT;
  4. SELECT @EmployeeCount AS EmployeeCount; -- 输出参数的值
复制代码
这将实行存储过程 GetEmployeeCount,并将部分ID为1的员工数量存储在 @EmployeeCount 变量中。然后,你可以通过 SELECT 语句检索输出参数的值。
4. 使用RETURN值的存储过程

  1. CREATE PROCEDURE ValidateLogin
  2.     @Username NVARCHAR(50),
  3.     @Password NVARCHAR(50)
  4. AS
  5. BEGIN
  6.     SET NOCOUNT ON;
  7.     DECLARE @Result INT;
  8.     -- 检查用户名和密码是否匹配
  9.     IF EXISTS (
  10.         SELECT 1
  11.         FROM Users
  12.         WHERE Username = @Username AND Password = @Password
  13.     )
  14.     BEGIN
  15.         -- 如果匹配,则设置返回值为1
  16.         SET @Result = 1;
  17.     END
  18.     ELSE
  19.     BEGIN
  20.         -- 如果不匹配,则设置返回值为0
  21.         SET @Result = 0;
  22.     END
  23.     -- 返回结果
  24.     RETURN @Result;
  25. END;
复制代码
在这个存储过程中:

你可以像如许调用这个存储过程,并获取返回的值:
  1. DECLARE @Username NVARCHAR(50) = 'example_user';
  2. DECLARE @Password NVARCHAR(50) = 'example_password';
  3. DECLARE @LoginResult INT;
  4. EXEC @LoginResult = ValidateLogin @Username, @Password;
  5. SELECT @LoginResult AS LoginResult;
复制代码
这将实行存储过程 ValidateLogin,并将提供的用户名和暗码作为参数传递给它。存储过程将验证登录信息并返回结果。然后,你可以通过 SELECT 语句检索存储过程的返回值。
5. 使用TRY...CATCH的存储过程(错误处置处罚)

  1. CREATE PROCEDURE InsertEmployee
  2.     @FirstName NVARCHAR(50),
  3.     @LastName NVARCHAR(50),
  4.     @DepartmentID INT
  5. AS
  6. BEGIN
  7.     SET NOCOUNT ON;
  8.     BEGIN TRY
  9.         -- 开始事务
  10.         BEGIN TRANSACTION;
  11.         -- 在Employees表中插入新员工记录
  12.         INSERT INTO Employees (FirstName, LastName, DepartmentID)
  13.         VALUES (@FirstName, @LastName, @DepartmentID);
  14.         -- 提交事务
  15.         COMMIT TRANSACTION;
  16.     END TRY
  17.     BEGIN CATCH
  18.         -- 发生错误时,回滚事务
  19.         IF @@TRANCOUNT > 0
  20.             ROLLBACK TRANSACTION;
  21.         -- 获取错误信息并将其输出
  22.         DECLARE @ErrorMessage NVARCHAR(4000) = ERROR_MESSAGE();
  23.         DECLARE @ErrorSeverity INT = ERROR_SEVERITY();
  24.         DECLARE @ErrorState INT = ERROR_STATE();
  25.         -- 在实际应用中,这里可以进行日志记录、通知等操作
  26.         PRINT 'Error Message: ' + @ErrorMessage;
  27.         PRINT 'Error Severity: ' + CAST(@ErrorSeverity AS NVARCHAR);
  28.         PRINT 'Error State: ' + CAST(@ErrorState AS NVARCHAR);
  29.     END CATCH;
  30. END;
复制代码
在这个存储过程中:

你可以像如许调用这个存储过程:
  1. EXEC InsertEmployee 'John', 'Doe', 1;
复制代码
假如实行过程中发生了错误,TRY...CATCH块将捕获并处置处罚它,确保事务被正确回滚,而且错误信息被记载或输出。
六、总结

总的来说,SQL Server数据库存储过程是一个强大而灵活的工具,可以资助数据库开辟人员提高效率、优化性能,并增强数据安全性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4