如何通过输出值调用函数内的存储过程,然后获取并返回该值?

时间:2014-08-24 12:52:42

标签: sql sql-server function stored-procedures

我有一个sp“spGetNewNumber”,它返回一个值作为新数字,如下所示:

USE [MyPhoneDB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


ALTER PROCEDURE [dbo].[spsRouteRules_getNewNumber]
          @oldNumber NVARCHAR(15),
          @newNumber NVARCHAR(15) = '0' OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT newTellNo as newNumber FROM changedPhones WHERE oldTelNo = @oldNumber;
END

现在我需要一个Function可以调用这个存储过程并从sp。

返回值

我尝试使用stackoverflow中的代码,如下所示:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER FUNCTION fnGetNewNumber 
(
    @oldNumber bigint
)
RETURNS bigint
AS
BEGIN
        -- Declare the return variable here
    DECLARE @returnValue bigint
    DECLARE @SQL varchar(500)

    SELECT @SQL = 'osql -S' +@@servername +' -E -q "exec spsRouteRules_getNewNumber ' + CONVERT(nchar, @oldNumber)
    -- SELECT @SQL
    EXEC master..xp_cmdshell @SQL,'@returnValue bigint output', @returnValue output

    -- Return the result of the function
    RETURN @returnValue;

END
GO

但没有回答这个功能和方法。

1 个答案:

答案 0 :(得分:0)

您必须使用函数而不是存储过程才能获得新值。

CREATE FUNCTION [dbo].[spsRouteRules_getNewNumber](@oldNumber NVARCHAR(15))
RETURNS NVARCHAR(15)
AS BEGIN
    SET NOCOUNT ON;

    RETURN ISNULL(SELECT TOP 1 newTellNo FROM changedPhones WHERE oldTelNo = @oldNumber),0);
END

您无法在函数内调用用户定义存储过程。您只能在另一个存储过程中调用存储过程。