SQL Server输出参数问题

Geo*_*ge2 32 sql sql-server stored-procedures sql-server-2008

我正在使用SQL Server 2008 Enterprise.我正在学习SQL Server存储过程的OUTPUT参数.例如,存储过程sp_add_jobschedule具有名为schedule_id的OUTPUT参数.

http://msdn.microsoft.com/en-us/library/ms366342.aspx

我的困惑是,看起来像OUTPUT参数可以提供一个输入值并且还返回一个值,看起来它有INPUT和OUTPUT参数的行为?是否允许不为OUTPUT参数提供任何INPUT值(使其看起来像纯输出参数行为)?

mar*_*c_s 60

混淆在某种程度上是合理的 - 而像Oracle这样的其他RDBMS确实有存储过程参数,这些参数可以是类型IN(仅输入),OUT(仅输出),或INOUT(两种方式 - "按引用传递"类型的参数).

SQL Server在这里有点草率,因为它将参数标记为OUTPUT,但实际上,这意味着INPUT/ OUTPUT- 它基本上只意味着存储的proc有可能从该参数的调用中返回一个值.

所以,是的-尽管它被称为OUTPUT参数,它是真正的性质转向INPUT/ OUTPUT参数,而这些IN,INOUT,OUT像甲骨文在SQL Server不存在(在T-SQL).

  • 是的 - 当然 - 您可以提供INPUT值或保留为空 - 如果您不在存储过程中使用它,那么您传入的内容完全没有意义.这取决于您和您在程序中编写的代码是否合适你甚至可以查看传入的值."OUTPUT"子句只是意味着存储过程能够在此参数中返回一个值 - 这就是全部. (3认同)

Ser*_*sev 19

我可以举例说明如何使用输出参数创建存储过程.

CREATE PROCEDURE test_proc

@intInput int,
@intOutput int OUTPUT

AS
set @intOutput = @intInput + 1 

go
Run Code Online (Sandbox Code Playgroud)

并调用此过程然后使用输出参数执行如下操作:

declare @intResult int
exec test_proc 3 ,@intResult OUT
select @intResult
Run Code Online (Sandbox Code Playgroud)

你看,你应该先声明ouput变量.执行存储过程后,输出值将在您的变量中.您可以为输出变量设置任何值,但在执行存储过程后,它将包含确切的存储过程返回值(无论输出变量中的值是什么).

例如:

declare @intResult int
exec test_proc 3 ,@intResult OUT
select @intResult
Run Code Online (Sandbox Code Playgroud)

它将返回4.并且:

declare @intResult int
set @intResult = 8
exec test_proc 3 ,@intResult OUT
select @intResult
Run Code Online (Sandbox Code Playgroud)

还返回4.

  • @ George2:是的,OUTPUT参数既作为输入参数又作为输出参数. (3认同)

Mat*_*att 6

是的,你可以使用OUTPUT参数传入和检索值(尽管我现在想不到有充分的理由这样做).

这是一个简单的例子,证明了这一点:

-- The stored procedure
CREATE PROCEDURE OutParamExample
    @pNum int OUTPUT
AS
BEGIN
    select @pNum
    set @pNum = @pNum + 5
END
GO

-- use a local variable to retrieve your output param value
declare @TheNumber int
set @TheNumber = 10

print @TheNumber
exec OutParamExample @TheNumber OUTPUT
print @TheNumber
Run Code Online (Sandbox Code Playgroud)

结果将如下所示:

10

-----------
10

(1 row(s) affected)

15
Run Code Online (Sandbox Code Playgroud)

编辑:好的,我想我错过了第二段中的"不",可能没有回答你问的问题.如果你想要一个严格的输出参数(例如返回代码之类的东西),你当然不必为作为输出参数传递的局部变量提供一个,但你仍然需要声明那个局部变量以便你能够有一种方法可以在程序本身范围之外访问返回值.

例如:

declare @LocalNumber int
-- I don't have to assign a value to @LocalNumber to pass it as a parameter
exex OutParamExample @LocalNumber OUTPUT  
-- (assume SP has been altered to assign some reasonable value)

-- but I do have to declare it as a local variable so I can get to
-- the return value after the stored procedure has been called
print @LocalNumber
Run Code Online (Sandbox Code Playgroud)