存储过程的返回值
上一篇 / 下一篇 2012-06-07 15:37:06 / 个人分类:面试
转载地址:http://msdn2.microsoft.com/zh-cn/library/ms188655.aspx
存储过程中的返回值的类型(3种)
说明如何使用 OUTPUT 参数将数据返回调用应用程序。 | |
说明如何使用返回代码。 | |
说明如何使用 OUPUT 参数中的游标数据类型。 |
1。使用 OUTPUT 参数返回数据
如果在过程定义中为参数指定 OUTPUT 关键字,则存储过程在退出时可将该参数的当前值返回至调用程序。若要用变量保存参数值以便在调用程序中使用,则调用程序必须在执行存储过程时使用 OUTPUT 关键字。
以下示例显示有一个输入参数和一个输出参数的存储过程。存储过程中的第一个参数@SalesPerson将接收由调用程序指定的输入值,第二个参数@SalesYTD将用于将该值返回调用程序。SELECT 语句使用@SalesPerson参数获取正确的SalesYTD值,并将该值分配给@SalesYTD输出参数。
USE AdventureWorks;
GO
---删除已经存在的存储过程
IF OBJECT_ID('Sales.uspGetEmployeeSalesYTD', 'P') IS NOT NULL
DROP PROCEDURE Sales.uspGetEmployeeSalesYTD;
GO
CREATE PROCEDURE Sales.uspGetEmployeeSalesYTD
@SalesPerson nvarchar(50),
@SalesYTD money OUTPUT
AS
SELECT @SalesYTD = SalesYTD
FROM Sales.SalesPerson AS sp
JOIN HumanResources.vEmployee AS e ON e.EmployeeID = sp.SalesPersonID
WHERE LastName = @SalesPerson;
RETURN
GO
下列语句使用输入参数值执行存储过程,并将存储过程的输出值保存在调用程序的局部变量@SalesYTD中。
-- Declare the variable to receive the output value of the procedure.
DECLARE @SalesYTDBySalesPerson money;
-- Execute the procedure specifying a last name for the input parameter
-- and saving the output value in the variable @SalesYTDBySalesPerson
EXECUTE Sales.uspGetEmployeeSalesYTD
N'Blythe', @SalesYTD = @SalesYTDBySalesPerson OUTPUT;
---或者 execute Sales.uspGetEmployeeSalesYTD 'Blythe',@SalesYTDBySalesPerson out;
-- Display the value returned by the procedure.
PRINT 'Year-to-date sales for this employee is ' +
convert(varchar(10),@SalesYTDBySalesPerson);
GO
也可以在执行存储过程时为 OUTPUT 参数指定输入值。这将允许存储过程从调用程序接收值,更改该值或使用该值执行操作,然后将新值返回调用程序。在上面的示例中,可以在执行存储过程之前为@SalesYTDBySalesPerson变量分配值。@SalesYTD变量包含存储过程主体中的参数的值,当存储过程退出时,@SalesYTD变量的值将返回调用程序。这常常被称作“传址调用功能”。
如果在执行存储过程时为参数指定 OUTPUT,而在存储过程中该参数又不是用 OUTPUT 定义的,那么将收到一条错误消息。执行存储过程时,可以执行带有 OUTPUT 参数的存储过程而不指定 OUTPUT。这样不会返回错误,但将无法在调用程序中使用输出值。
2。使用返回代码返回数据存储过程可以返回一个整数值(称为“返回代码”),指示过程的执行状态。使用 RETURN 语句指定存储过程的返回代码。与 OUTPUT 参数一样,执行存储过程时必须将返回代码保存到变量中,才能在调用程序时使用返回代码值。例如,数据类型int的赋值变量@result用于存储来自存储过程my_proc的返回代码,如:
DECLARE @result int;
EXECUTE @result = my_proc;
返回代码通常用在存储过程内的控制流块中,为每种可能的错误情况设置返回代码值。可以在 Transact-SQL 语句后使用 @@ERROR 函数,来检测该语句执行过程中是否有错误发生。
A. 根据错误类型返回不同的返回代码
下面的示例显示了带有错误处理设置(为各种错误设置特殊返回代码值)的usp_GetSalesYTD过程。下表显示了由存储过程分配给每个可能错误的整数值,以及每个值的相应含义。
返回代码值 | 含义 |
---|---|
0 | 成功执行。 |
1 | 未指定所需参数值。 |
2 | 指定参数值无效。 |
3 | 获取销售额数值时出错。 |
4 | 该销售人员的销售额数值为 NULL。 |
USE AdventureWorks;
GO
IF OBJECT_ID('Sales.usp_GetSalesYTD', 'P') IS NOT NULL
DROP PROCEDURE Sales.usp_GetSalesYTD;
GO
CREATE PROCEDURE Sales.usp_GetSalesYTD
@SalesPerson nvarchar(50) = NULL, -- NULL default value
@SalesYTD money = NULL OUTPUT
AS
-- Validate the @SalesPerson parameter.
IF @SalesPerson IS NULL
BEGIN
PRINT 'ERROR: You must specify a last name for the sales person.'
RETURN(1)
END
ELSE
BEGIN
-- Make sure the value is valid.
IF (SELECT COUNT(*) FROM HumanResources.vEmployee
WHERE LastName = @SalesPerson) = 0
RETURN(2)
END
-- Get the sales for the specified name and
-- assign it to the output parameter.
SELECT @SalesYTD = SalesYTD
FROM Sales.SalesPerson AS sp
JOIN HumanResources.vEmployee AS e ON e.EmployeeID = sp.SalesPersonID
WHERE LastName = @SalesPerson;
-- Check for SQL Server errors.
IF @@ERROR <> 0
BEGIN
RETURN(3)
END
ELSE
BEGIN
-- Check to see if the ytd_sales value is NULL.
IF @SalesYTD IS NULL
RETURN(4)
ELSE
-- SUCCESS!!
RETURN(0)
END
-- Run the stored procedure without specifying an input value.
EXEC Sales.usp_GetSalesYTD;
GO
-- Run the stored procedure with an input value.
DECLARE @SalesYTDForSalesPerson money, @ret_code int;
-- Execute the procedure specifying a last name for the input parameter
-- and saving the output value in the variable @SalesYTD
EXECUTE Sales.usp_GetSalesYTD
N'Blythe', @SalesYTD = @SalesYTDForSalesPerson OUTPUT;
PRINT N'Year-to-date sales for this employee is ' +
CONVERT(varchar(10), @SalesYTDForSalesPerson);
B. 处理存储过程返回的不同返回代码。
下面的示例创建了处理从usp_GetSalesYTD过程返回的返回代码的程序。
-- Declare the variables to receive the output value and return code3。在 OUTPUT 参数中使用 cursor 数据类型
-- of the procedure.
DECLARE @SalesYTDForSalesPerson money, @ret_code int;
-- Execute the procedure with a title_id value
-- and save the output value and return code in variables.
EXECUTE @ret_code = Sales.usp_GetSalesYTD
N'Blythe', @SalesYTD = @SalesYTDForSalesPerson OUTPUT;
-- Check the return codes.
IF @ret_code = 0
BEGIN
PRINT 'Procedure executed successfully'
-- Display the value returned by the procedure.
PRINT 'Year-to-date sales for this employee is ' + CONVERT(varchar(10),@SalesYTDForSalesPerson)
END
ELSE IF @ret_code = 1
PRINT 'ERROR: You must specify a last name for the sales person.'
ELSE IF @ret_code = 2
PRINT 'EERROR: You must enter a valid last name for the sales person.'
ELSE IF @ret_code = 3
PRINT 'ERROR: An error occurred getting sales value.'
ELSE IF @ret_code = 4
PRINT 'ERROR: No sales recorded for this employee.'
Transact-SQL 存储过程只能将cursor数据类型用于 OUTPUT 参数。如果为某个参数指定了cursor数据类型,也必须指定 VARYING 和 OUTPUT 参数。如果为某个参数指定了 VARYING 关键字,则数据类型必须是cursor,并且必须指定 OUTPUT 关键字。
注意: |
---|
cursor数据类型不能通过数据库 API(例如 OLE DB、ODBC、ADO 和 DB-Library)绑定到应用程序变量上。因为必须先绑定 OUTPUT 参数,应用程序才可以执行存储过程,所以带有cursorOUTPUT 参数的存储过程不能通过数据库 API 调用。只有将cursorOUTPUT 变量分配给 Transact-SQL 局部cursor变量时,才可以通过 Transact-SQL 批处理、存储过程或触发器调用这些过程。 |
在执行过程时,以下规则适用于cursor输出参数:
- 对于只进游标,游标的结果集中返回的行只是那些存储过程执行结束时处于或超出游标位置的行,例如:
- 在过程中的名为 RS 的 100 行结果集上打开一个非滚动游标。
- 过程提取结果集 RS 的头 5 行。
- 过程返回到其调用者。
- 返回到调用者的结果集 RS 由 RS 的第 6 到 100 行组成,调用者中的游标处于 RS 的第一行之前。
- 对于只进游标,如果存储过程完成后,游标位于第一行的前面,则整个结果集将返回给调用批处理、存储过程或触发器。返回时,游标将位于第一行的前面。
- 对于只进游标,如果存储过程完成后,游标的位置超出最后一行的结尾,则为调用批处理、存储过程或触发器返回空结果集。
注意: 空结果集与空值不同。 - 对于可滚动游标,在存储过程执行结束时,结果集中的所有行均会返回给调用批处理、存储过程或触发器。返回时,游标保留在过程中最后一次执行提取时的位置。
- 对于任意类型的游标,如果游标关闭,则将空值传递回调用批处理、存储过程或触发器。如果将游标指派给一个参数,但该游标从未打开过,也会出现这种情况。
注意: 关闭状态只有在返回时才有影响。例如,可以在过程中关闭游标,稍后再打开游标,然后将该游标的结果集返回给调用批处理、存储过程或触发器。
在下面的示例中,创建了使用cursor数据类型指定输出参数@currency_cursor的存储过程。然后在批处理中调用存储过程
首先,创建以下过程,在 Currency 表上声明并打开一个游标。
USE AdventureWorks;
GO
IF OBJECT_ID ( 'dbo.uspCurrencyCursor', 'P' ) IS NOT NULL
DROP PROCEDURE dbo.uspCurrencyCursor;
GO
CREATE PROCEDURE dbo.uspCurrencyCursor
@CurrencyCursor CURSOR VARYING OUTPUT
AS
SET @CurrencyCursor = CURSOR
FORWARD_ONLY STATIC FOR
SELECT CurrencyCode, Name
FROM Sales.Currency;
OPEN @CurrencyCursor;
GO
接下来,执行一个批处理,声明一个局部游标变量,执行上述过程以将游标赋值给局部变量,然后从该游标提取行。
USE AdventureWorks;
GO
DECLARE @MyCursor CURSOR;
EXEC dbo.uspCurrencyCursor @CurrencyCursor = @MyCursor OUTPUT;
WHILE (@@FETCH_STATUS = 0)
BEGIN;
FETCH NEXT FROM @MyCursor;
END;
CLOSE @MyCursor;
DEALLOCATE @MyCursor;
转自:http://hi.baidu.com/lx_lhy/blog/item/fc347c00af03c514738b65eb.html
TAG:
我的栏目
标题搜索
日历
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
1 | 2 | 3 | 4 | 5 | 6 | ||||
7 | 8 | 9 | 10 | 11 | 12 | 13 | |||
14 | 15 | 16 | 17 | 18 | 19 | 20 | |||
21 | 22 | 23 | 24 | 25 | 26 | 27 | |||
28 | 29 | 30 |
我的存档
数据统计
- 访问量: 145564
- 日志数: 249
- 书签数: 41
- 建立时间: 2007-08-11
- 更新时间: 2013-03-28