Sql 如何通过输出值调用函数中的存储过程,然后获取并返回该值?
我有一个sp“spGetNewNumber”,它返回一个值作为新的数字,如下所示: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
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
是一个扩展存储过程。整个问题看起来很可笑。如果这是真正的问题,为什么不让第一个存储过程成为函数呢?