2016-06-13 132 views
0

存储过程此存储过程#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 

的问题是这里我是不是能够执行@test在存储过程#1中调用存储过程#2。当我执行sp1时,我得到了空值,但是当我在sp1中执行sp2查询时,我得到了正确的值。我是否可以知道可以解决问题的可能解决方案或类似示例?

回答

2

你的存储过程sp2输出的结果选择,但像所有存储的特效,它返回整数使用return声明。您没有return声明,因此Sql Server为您生成一个:return 0。返回代码的目的是提供关于它是否按预期运行的反馈。按照惯例,返回代码0意味着没有错误。

这显示了返回代码和存储过程的输出之间的区别。创建临时表#output以捕获存储的proc输出的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 
0

创建一个表变量&使用方法如下:

create proc test55 
as 
select 55 


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

我是否在sp1中创建表变量?和什么创建proc test55 作为选择55显示?? –

+0

在sp1中创建表var并选择55是您对sp2的查询 –

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