Sql 用户定义函数调用与在存储过程中调用UDF

Sql 用户定义函数调用与在存储过程中调用UDF,sql,sql-server,Sql,Sql Server,我有一个在存储过程中调用的用户定义函数。存储过程只返回从UDF标量函数获得的值 但是, Select * UDF_FunctionName(param1,param2) udf电话在这里- SELECT dbo.udfFunction('1234',10) as result 及 结果不同 StoreProcName调用'UDF_FunctionName(param1,param2) 存储过程代码在这里- BEGIN SET NOCOUNT ON; Return SELECT [

我有一个在存储过程中调用的用户定义函数。存储过程只返回从UDF标量函数获得的值

但是,

Select * UDF_FunctionName(param1,param2) 
udf电话在这里-

SELECT dbo.udfFunction('1234',10) as result 

结果不同

StoreProcName
调用'UDF_FunctionName(param1,param2)

存储过程代码在这里-

BEGIN 
 SET NOCOUNT ON; 
 Return SELECT [DbName].[dbo].[udfFunction](@param1, @param2) 
END 

产生不同结果的原因可能是什么?

您试图同时使用
返回
选择

Return SELECT [DbName].[dbo].[udfFunction](@param1, @param2) 
您不能这样做,您可以返回结果,也可以选择它。根据您选择的类型,检索值将有所不同

如果您这样做:

SELECT [DbName].[dbo].[udfFunction](@param1, @param2) 
RETURN [DbName].[dbo].[udfFunction](@param1, @param2) 
然后结果集将有一行和一列包含您的值。像访问任何其他结果集一样访问此结果集

如果您这样做:

SELECT [DbName].[dbo].[udfFunction](@param1, @param2) 
RETURN [DbName].[dbo].[udfFunction](@param1, @param2) 
存储过程将有一个返回值,它是函数调用的结果。通过定义一个标量变量并将其分配给SP调用的结果来访问它-假设结果是

DECLARE @result INT
EXEC @Result = StoredProcName(@param1, @param2)

在存储过程中不应以这种方式使用
RETURN
。如果要向调用代码返回标量值,请使用<代码>返回为空

你可能有

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

这肯定需要一个新的解决方案。试一试如果法律允许您显示,我们需要查看结果和代码。您的结果是什么/函数的结果和存储过程的结果有何不同?是的,我不允许合法显示。它只是返回一个正确或错误的答案。但是从sql的角度来看,这两个语句之间有什么区别吗?。抱歉,无法提供更多信息。您不需要向我们显示您的实际代码!您需要向我们展示一个如何重现该问题的示例。否则这是无法回答的。