介绍
储存过程在MSSQL数据库中是一组SQL语句的集合。它们被作为一个单元储存在数据库中,可以在需要时被调用。储存过程是一种存储在数据库服务器中的预编译模块,被编码为独立实体,并可以在需要时进行调用。在进行MSSQL储存过程查询之前,我们需要了解它们的语法和基本结构。
基础语法
储存过程通常以CREATE PROCEDURE语句开始声明。下面是一个示例:
CREATE PROCEDURE name
[ @parameter data_type = default ]
[ ,...n ]
AS
SQL语句
参数
储存过程可以带有参数列表,这些参数可以是输入参数、输出参数或双向参数。定义参数可以为储存过程提供灵活性并允许我们共享代码。下面是一个例子:
CREATE PROCEDURE usp_name
@input_parameter INT,
@output_parameter INT OUTPUT,
@inout_parameter INT OUTPUT
储存过程可以有多个参数,我们需要为每个参数提供数据类型和名称。参数名称以“@”符号开头。
变量
可以在储存过程中使用变量。按照惯例,变量名称以“@”符号开头,但不需要提供数据类型,因为在使用变量之前,必须对其进行声明并设置为数据类型。
DECLARE @variable_name data_type
SET @variable_name = value
下面是一个示例:
DECLARE @title varchar(50)
SET @title = 'MSSQL Procedure'
控制结构
在储存过程中,控制结构可用于控制SQL语句的流程。这包括IF语句、WHILE循环、TRY/CATCH块等。
IF condition
BEGIN
SQL语句
END
下面是一个示例:
CREATE PROCEDURE usp_sales
@product varchar(50),
@year int
AS
BEGIN
DECLARE @product_id int
SELECT @product_id = ProductID FROM Products WHERE Name = @product
IF @product_id is null
BEGIN
RAISERROR ('Product not found!',16,1)
RETURN
END
SELECT * FROM Sales WHERE ProductID = @product_id AND YEAR(DateSold) = @year
END
实践
让我们通过一个简单的示例来实践储存过程查询。我们将创建一个储存过程,该过程需要客户的姓氏并返回相应的联系人列表。我们将使用AdventureWorks2012示例数据库。
创建储存过程
首先,我们需要创建储存过程。下面是它的语法:
CREATE PROCEDURE sp_GetContactByLastName
@LastName VARCHAR(50)
AS
BEGIN
SELECT FirstName, LastName, EmailAddress
FROM Person.Person
WHERE LastName = @LastName
END
我们为储存过程命名为“sp_GetContactByLastName”,该过程需要一个@LastName参数。它将从“Person.Person”表中选择联系人的FirstName,LastName和EmailAddress列,并使用提供的参数过滤结果。
执行储存过程
要执行储存过程,我们可以使用EXEC命令。下面是它的语法:
EXEC sp_GetContactByLastName 'Blythe'
在这个例子中,我们将@LastName参数设置为“Blythe”。这将导致我们从表中选择姓名为“Blythe”的所有联系人。结果如下:
FirstName | LastName | EmailAddress |
Janet | Blythe | janet0@adventure-works.com |
使用OUTPUT参数
储存过程也可以使用OUTPUT参数。下面是示例的语法:
CREATE PROCEDURE sp_GetContactCountByLastName
@LastName VARCHAR(50),
@ContactCount INT OUTPUT
AS
BEGIN
SELECT @ContactCount = COUNT(*)
FROM Person.Person
WHERE LastName = @LastName
END
我们向这个储存过程添加了一个新参数@ContactCount,并将其设置为OUTPUT参数。我们首先从表中选取LastName匹配@LastName参数的所有联系人的数量,然后将该数量存储在@ContactCount参数中。通过在执行储存过程时提供@ContactCount参数,我们可以检索存储的值。
DECLARE @count INT
EXEC sp_GetContactCountByLastName 'Blythe', @count OUTPUT
SELECT @count AS ContactCount
执行以上代码后,我们将看到以下结果:
ContactCount |
1 |
结论
通过使用储存过程查询,我们可以避免在每次查询时编写相同的SQL语句。储存过程也提供了更好的代码重用性和可维护性。我们了解了储存过程的基础语法,包括声明和使用参数、变量和控制结构。我们还通过一个示例学习了如何创建和调用储存过程,并了解了如何使用OUTPUT参数。