2015-10-07 107 views
0

我是SQL-Server的新手。我有多個程序。過程1如下所示基於int值過濾數據。如何將表變量傳遞給SQL-Server 2014中的存儲過程

Procedure1 '70' 

Another1過程2,分析過程1輸出,並再次過濾器,在兩個值

的基礎上
Procedure2 '10', '20' 

現在我想寫接收3個參數,一個主要程序,並先通過第一個參數Procedure1然後procedure2接收Procedure1的輸出以及第二個和第三個參數來執行分析。

的主要程序代碼是

CREATE PROCEDURE spA_Main 
(
@Argument1 int, 
@Argument2 int, 
@Argument3 int 
) 
AS 
Begin 

DECLARE @Task1Table TABLE 
(
Userid  varchar(20), 
Dtime  float, 
Utime  float, 
Days  int 

) 

--Task1 
INSERT @Task1Table Execute Procedure1 @Argument1 


--Task2 

--SELECT * FROM @Task1Table 
END 
+1

閱讀有關表值參數:https://開頭msdn.microsoft.com/en-us/library/bb510489.aspx –

回答

2

創建一個函數,而不是一個程序,語法將是這樣的:

CREATE FUNCTION [ schema_name. ] function_name ([ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type 
    [ = default ] [READONLY] } 
    [ ,...n ] 
    ] 
) 
RETURNS @return_variable TABLE <table_type_definition> 
    [ WITH <function_option> [ ,...n ] ] 
    [ AS ] 
    BEGIN 
     function_body 
     RETURN 
    END 
[ ; ] 

有它返回的第一個程序將返回的數據,將其存儲在臨時表中。比把它作爲第二個程序的論據。

另外我認爲將所有這些過程合併爲1會更有意義,因爲SQL不像編程語言那樣是查詢語言。

+0

我喜歡你的評論,以保持它的單一過程,因爲我可以輕鬆聲明多個表變量來存儲中間結果,儘管它會使程序很長。 –

0

在過程中傳遞表,您需要在創建表類型之前。 例如

CREATE TYPE TaskTable AS TABLE 
(
    Userid  varchar(20), 
    Dtime  float, 
    Utime  float, 
    Days  int 
) 

您可以在程序中使用此表類型變量爲:

CREATE PROCEDURE yourProcName 
(
    @pTaskTable AS TaskTable READONLY 
) 
BEGIN 
--your code 
END 

本人認爲使用上述方法,你可以實現你的目標

相關問題