是否可以在传递的相同函数内修改输入参数的值?

时间:2014-05-15 18:58:27

标签: sql-server function parameters local-variables

目前我不得不将参数的值赋给局部变量。我显然能够修改它。

当涉及以相同值开头的参数和局部变量时,只想稍微减少代码并减少混淆。

即。

@parameterAddress @variableAddress

能够单独使用 @parameterAddress 会更简单。

2 个答案:

答案 0 :(得分:0)

如果您说的是存储过程......那么这是一个回复。

(我不确定“功能”是指一般意义上的......或者特别是“用户定义的功能”。)

但是: 创建局部变量并将其设置为输入参数的值是一个很好的SQL-PARAMETER-SNIFFING解决方法。

http://blogs.msdn.com/b/turgays/archive/2013/09/10/parameter-sniffing-problem-and-workarounds.aspx

在上面的链接中查找“使用局部变量”。

因此,使代码“修剪”的努力可能会产生意想不到的后果。

一遍又一遍地运行这部分,看看会发生什么:

Declare @OrderID int
select @OrderID = -99999
EXEC dbo.uspOrderGetByOverrideSurrogateKey @OrderID

完整代码:

Use Northwind
GO

/*

Declare @OrderID int
select @OrderID = -99999
EXEC dbo.uspOrderGetByOverrideSurrogateKey @OrderID

*/


IF EXISTS 
    (
    SELECT * FROM INFORMATION_SCHEMA.ROUTINES  WHERE ROUTINE_TYPE = N'PROCEDURE' and ROUTINE_SCHEMA = N'dbo' and ROUTINE_NAME = N'uspOrderGetByOverrideSurrogateKey'  
    )
BEGIN
    DROP PROCEDURE [dbo].[uspOrderGetByOverrideSurrogateKey]
END


GO

CREATE Procedure dbo.uspOrderGetByOverrideSurrogateKey (
@OrderID int
)
AS

BEGIN

    SET NOCOUNT ON

    Select @OrderID = (select top 1 OrderID from dbo.Orders order by newid() )


    SELECT o.OrderID,o.CustomerID,o.EmployeeID,o.OrderDate,o.RequiredDate,o.ShippedDate,o.ShipVia ,o.Freight,o.ShipName,o.ShipAddress,o.OrderID,o.CustomerID,o.EmployeeID,o.OrderDate 
    FROM 
        dbo.Orders o 
     WHERE 
        o.OrderID = @OrderID


    SET NOCOUNT OFF

END

GO 

答案 1 :(得分:0)

您询问的是函数而不是存储过程,所以答案应该是肯定的。但是你要小心谨慎。

一个简单的测试表明,传递给函数的变量不会被更改。这表示参数是按值传递的(即副本在堆栈上传递),而不是通过引用传递。

CREATE FUNCTION dbo.MyFunc
(
    @input int
)
RETURNS int
BEGIN
    SET @input = @input + 3;
    RETURN @input;
END;

DECLARE @i INT;
SET @i = 2;

SELECT dbo.MyFunc(@i);

SELECT @i as '@i';

结果是5和2.所以即使在函数内部更改了@input,@ i也不会改变。