Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何通过输出值调用函数中的存储过程,然后获取并返回该值?_Sql_Sql Server_Function_Stored Procedures - Fatal编程技术网

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

Sql 如何通过输出值调用函数中的存储过程,然后获取并返回该值?,sql,sql-server,function,stored-procedures,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 B

我有一个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
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
现在我需要一个函数来调用这个存储过程并从sp返回值

我尝试使用stackoverflow中的以下代码:

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

但未回答此函数和方法。

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

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

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

简单回答,您不能在函数中调用过程。但是您可以从另一个存储过程调用此存储过程。@M.Ali。您可以在函数中调用扩展存储过程,
xp\u cmdshell
是一个扩展存储过程。整个问题看起来很可笑。如果这是真正的问题,为什么不让第一个存储过程成为函数呢?