从其他存储过程调用存储过程

时间:2016-06-13 03:39:04

标签: sql sql-server database stored-procedures

这是存储过程#1:

ALTER PROCEDURE [dbo].[sp1]
AS
BEGIN       
    DECLARE @test varchar(255)
    exec @test = dbo.sp2
    SET NOCOUNT ON;

    SELECT 
        CMS_ORG.description, @test
    FROM
        CMS_ORG
END

这是存储过程#2:

ALTER PROCEDURE [dbo].[sp2]
AS
BEGIN   
     SET NOCOUNT ON;
     SELECT 
         CMS_MAS.description  + '' + CONVERT(varchar(50),    
         CAST(CMS_ORG.amount AS money), 1)
     FROM 
         CMS_ORG
     INNER JOIN 
         CMS_MAS = CMS_ORG.GUID = CMS_MAS.GUID
END

问题在于我无法通过调用存储过程#2在存储过程#1中执行@test。当我执行sp1时,我得到了一个空值,但是当我在sp1中执行sp2的查询时,我得到了一个正确的值。我可以知道可以解决问题的可能解决方案或类似示例是什么?

3 个答案:

答案 0 :(得分:2)

您的存储过程sp2 输出 SELECT的结果,但与所有存储过程一样,使用return语句返回一个整数。您没有return语句,因此Sql Server会为您生成一个语句:return 0。返回代码的目的是提供有关它是否按预期运行的反馈。按照惯例,返回码为0表示没有错误。

这显示了返回代码与存储过程输出之间的差异。创建临时表#output以捕获存储过程输出的SELECT行。

DECLARE @return_code int

-- capture the output of the stored proc sp2 in a temp table
create table #output( column_data varchar(max) )
insert #output( column_data )
exec @return_code = dbo.sp2   -- returns 0 because you have no RETURN statement

-- extract column_data from #output into variable @test
-- if there is more than one row in #output, it will take the last one
DECLARE @test varchar(255)
select @test = column_data from #output

答案 1 :(得分:0)

创建表变量&像这样使用它:

create proc test55
as
select 55  


declare @test table (Value Varchar(255))
insert into @test
exec   test55
Select * from  @test 

答案 2 :(得分:0)

您的sp2存储过程将返回表,而不是varchar(255)

如果你想从sp2获得varchar(255),你应该使用函数。

您可以在我的示例中查看:

定义一个函数:

CREATE FUNCTION dbo.function1()
RETURNS varchar(255)  
WITH EXECUTE AS CALLER  
AS  
BEGIN  
     DECLARE @returnVal varchar(255);  

     SET @returnVal = (SELECT top 1 [ProductName]
                        FROM [dbo].[Products])

     RETURN(@returnVal);  
END; 

像这样改变SP1:

ALTER PROCEDURE [dbo].[sp1]
    @SMonth As Integer,
    @SYear As Integer
AS
BEGIN       
    DECLARE @test varchar(255)

    set @test = dbo.function1()

    SET NOCOUNT ON;

    SELECT [ProductId], @test
      FROM [LearningKO].[dbo].[Products]
END