2015-10-07 83 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 

本人认为使用上述方法,你可以实现你的目标

相关问题