用户定义的函数调用vs在Store过程中调用UDF

时间:2015-07-28 14:33:14

标签: sql sql-server

我有一个在存储过程中调用的用户定义函数。该存储过程所做的就是返回从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 

可能导致不同结果的原因是什么?

2 个答案:

答案 0 :(得分:0)

您正在尝试一起使用RETURNSELECT

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 parameterRETURNgenerally 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