首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从其他存储过程调用存储过程

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

Stack Overflow用户
提问于 2016-06-13 03:39:04
回答 3查看 86关注 0票数 0

这是存储过程#1:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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查询时,得到了一个正确的值。请问有甚麽可行的解决办法或类似的例子可以解决这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-13 05:52:50

存储的proc sp2输出选择的结果,但与所有存储的procs一样,它使用return语句返回一个整数。您没有return语句,所以Server为您生成一个语句:return 0。返回代码的目的是给出它是否按预期运行的反馈。按照约定,返回代码为0意味着没有错误。

这显示了返回代码与存储的proc的输出之间的区别。创建一个临时表#output来捕获存储的proc输出的SELECT的行。

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2016-06-13 03:46:24

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

代码语言:javascript
复制
create proc test55
as
select 55  


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

Stack Overflow用户

发布于 2016-06-13 04:02:38

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

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

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

定义一个函数:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37781477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档