目前我不得不将参数的值赋给局部变量。我显然能够修改它。
当涉及以相同值开头的参数和局部变量时,只想稍微减少代码并减少混淆。
即。
@parameterAddress 与 @variableAddress
能够单独使用 @parameterAddress 会更简单。
答案 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也不会改变。