我有一个在存储过程中调用的用户定义函数。该存储过程所做的就是返回从UDF标量函数获得的值。
然而,
Select * UDF_FunctionName(param1,param2)
udf电话在这里 -
SELECT dbo.udfFunction('1234',10) as result
和
Exec StoreProcName(param1,param2)
正在返回不同的结果。
StoreProcName
调用`UDF_FunctionName(param1,param2)
sproc代码在这里 -
BEGIN
SET NOCOUNT ON;
Return SELECT [DbName].[dbo].[udfFunction](@param1, @param2)
END
可能导致不同结果的原因是什么?
答案 0 :(得分:0)
您正在尝试一起使用RETURN
和SELECT
:
Return SELECT [DbName].[dbo].[udfFunction](@param1, @param2)
您不能这样做,您要么返回结果,要么选择它。根据您的选择,检索值会有所不同。
如果你这样做:
SELECT [DbName].[dbo].[udfFunction](@param1, @param2)
然后结果集将包含一个包含您的值的行和列。完全像访问任何其他结果集一样访问它。
如果你这样做:
RETURN [DbName].[dbo].[udfFunction](@param1, @param2)
您的存储过程将具有返回值,这是函数调用的结果。通过定义标量变量并将其分配给SP调用的结果来访问它 - 假设结果为INT
,可能看起来像
DECLARE @result INT
EXEC @Result = StoredProcName(@param1, @param2)
答案 1 :(得分:0)
您不应以这种方式在存储过程中使用RETURN
。如果要将标量值返回到调用代码,请使用OUTPUT
parameter。 RETURN
为generally used for status codes。
你可能有像
这样的东西-- SAMPLE UDF
CREATE FUNCTION dbo.YourUDF (@Username VARCHAR(30), @EntityID INT)
RETURNS INT
AS
BEGIN
RETURN @EntityID;
END
GO
-- SAMPLE PROCEDURE
CREATE PROCEDURE dbo.YourProc @Username VARCHAR(30), @EntityID INT, @Output INT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET @Output = dbo.YourUDF(@Username, @EntityID);
IF @Output IS NULL -- AN ERROR
BEGIN
RETURN 1; -- RETURN A STATUS OF -1 TO INDICATE ERROR
END
END
然后您可以将其称为:
DECLARE @Output INT, @ReturnValue INT;
EXECUTE @ReturnValue = dbo.YourProc
@Username = '1234',
@EntityID = 1,
@Output = @Output OUTPUT;
SELECT ValueFromUDF = @Output,
ReturnValue = @ReturnValue;
返回:
ValueFromUDF ReturnValue
------------------------------
1 0
如果我们将NULL
作为@EntityID传递,以触发人为错误,那么我们的返回状态为-1:
DECLARE @Output INT, @ReturnValue INT;
EXECUTE @ReturnValue = dbo.YourProc
@Username = '1234',
@EntityID = NULL,
@Output = @Output OUTPUT;
SELECT ValueFromUDF = @Output,
ReturnValue = @ReturnValue;
ValueFromUDF ReturnValue
------------------------------
NULL 1