2016-06-13 98 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