日期:2014-05-17  浏览次数:20466 次

请问,这个储存过程看不懂
下面的例子来自MSDN:http://msdn.microsoft.com/zh-cn/library/ms188655

储存过程主体:
CREATE PROCEDURE Sales.uspGetEmployeeSalesYTD
@SalesPerson nvarchar(50),
@SalesYTD money OUTPUT
AS  
  SET NOCOUNT ON;
  SELECT @SalesYTD = SalesYTD
  FROM Sales.SalesPerson AS sp
  JOIN HumanResources.vEmployee AS e ON e.BusinessEntityID = sp.BusinessEntityID
  WHERE LastName = @SalesPerson;
RETURN
GO


调用储存过程:
DECLARE @SalesYTDBySalesPerson money;
EXECUTE Sales.uspGetEmployeeSalesYTD N'Blythe', @SalesYTD = @SalesYTDBySalesPerson OUTPUT;
PRINT 'Year-to-date sales for this employee is ' + convert(varchar(10),@SalesYTDBySalesPerson);
GO


问题:
@SalesYTD参数是OUTPUT型,意味着可以传入值、传出值,可是,在储存过程主体中,@SalesYTD在等号左边啊,怎么能传入值呢?

------解决方案--------------------
@SalesYTD = @SalesYTDBySalesPerson OUTPUT

楼主是在疑问这句么?这里相当于获取存储过程传出参数的具体值,语法如此。
------解决方案--------------------
@SalesYTD是output参数,不是input参数
------解决方案--------------------
楼主也可以这么执行

DECLARE @SalesYTDBySalesPerson money;
EXECUTE Sales.uspGetEmployeeSalesYTD N'Blythe',@SalesYTDBySalesPerson OUTPUT;

也可以

EXECUTE Sales.uspGetEmployeeSalesYTD @SalesPerson 
 = N'Blythe',@SalesYTD = @SalesYTDBySalesPerson OUTPUT;

------解决方案--------------------
探讨
@SalesYTD在等号左边啊,怎么能传入值呢?

------解决方案--------------------
探讨
引用:
@SalesYTD在等号左边啊,怎么能传入值呢?

在左边才是给参数@SalesYTD传值,若是在右边的话就是使用它的值了

------解决方案--------------------
这种情况表示的是传参标示,用不用都可,有以下几种形式:
DECLARE @SalesYTDBySalesPerson money;

--都不用
EXECUTE Sales.uspGetEmployeeSalesYTD N'Blythe', @SalesYTDBySalesPerson OUTPUT;

--都用
EXECUTE Sales.uspGetEmployeeSalesYTD @SalesPerson=N'Blythe', @SalesYTD = @SalesYTDBySalesPerson OUTPUT;

--前面不用后面用(注意前面不用后面可以用,但前面用了后面必须用)
EXECUTE Sales.uspGetEmployeeSalesYTD N'Blythe',@SalesYTD = @SalesYTDBySalesPerson OUTPUT;

--颠倒用(颠倒了就必须要一一对应的用)
EXECUTE Sales.uspGetEmployeeSalesYTD @SalesYTD=@SalesYTDBySalesPerson OUTPUT,@SalesPerson=N'Blythe';

--还有一种情况,当存储过程带有缺省值参数的时候,调用时缺省的参数可以不赋值,而直接用这种方式来跳过缺少参数传参