通过从SQL Server中的函数传递输入到过程来执行过程

时间:2017-03-12 16:03:25

标签: sql sql-server function stored-procedures

为了给你一个背景,我正在做的是我有Informix数据库,我正在将Informix中的程序和函数转换为SQL Server程序和函数。我已经转换了代码,我想执行它。

现在,该过程具有输入参数,这些输入参数来自函数。下面是程序和功能声明的快照。

  

功能声明

CREATE FUNCTION sp_agent_log_activity (@p_startTime DATETIME,
                                       @p_endTime DATETIME,
                                       @p_sortBy int = 0,
                                       @p_resGroupList VARCHAR(4000) = 'NULL',
                                       @p_agentList VARCHAR(4000) = 'NULL',
                                       @p_skillList VARCHAR(4000) = 'NULL',
                                       @p_teamList VARCHAR(4000) = 'NULL')
RETURNS @sp_agent_log_activity_tab TABLE ( Agent_Name NVARCHAR(50),
          Agent_Login_ID NVARCHAR(50),
          Agent_Extension NVARCHAR(50),
          op1 NVARCHAR(1),
          Login_Time DATETIME2(3),
          op2 NVARCHAR(1),
          Logout_Time DATETIME2(3),
          Logout_Reason_Code SMALLINT,
          Logon_Duration INT,
          latestSynchedTime DATETIME2(3))
  

程序声明

CREATE PROCEDURE getAgentLogActivity @p_agentname NVARCHAR(50),
                @p_agentloginid NVARCHAR(50), 
                @p_startTime DATETIME,
                @p_endTime DATETIME             
AS
BEGIN

    DECLARE @l_event_login SMALLINT
    DECLARE @l_event_logout SMALLINT
    DECLARE @l_eventtype SMALLINT
    DECLARE @l_reasoncode SMALLINT
    DECLARE @l_agentid INT
    DECLARE @l_eventdatetime DATETIME
    DECLARE @l_filter BIT
    DECLARE @l_mineventdatetime DATETIME
    DECLARE @l_maxeventdatetime DATETIME
    DECLARE @SWV_cursor_var1 CURSOR

另外作为参考我在github下面有程序和功能。 Function and Procedure Complete code

如果有人能指导我如何从函数输入参数到程序,我会很高兴。

1 个答案:

答案 0 :(得分:1)

好吧,假设您已准备好实施它,请仔细阅读文档。

在SQL Server 2008之前,对于存储过程,我们只能基于默认系统数据类型创建默认数据类型(Int,Varchar,Bit等)或用户定义类型的参数。

2008年,SQL Server引入了用户定义table type。基本上是表示表结构的数据类型。

对于2008之前的示例,我们只能创建基本类型的默认sql server数据类型的用户定义类型。类似......

CREATE TYPE [dbo].[TestTypeName]  --<-- Name of the data type  
FROM VARCHAR(15) NOT NULL ;       --<--  VARCHAR(15) is the base data type

在SQL Server 2008中,我们能够创建表示表格结构的数据类型......

CREATE TYPE [dbo].[TestTableTypeName]   --<-- Name of the data type 
AS TABLE   
    ( Column1 VARCHAR(50)               --<-- a Table as a base data type
    , Column2 INT );  
GO  

现在我们可以创建这些Table类型,这意味着我们也可以定义这种类型的变量。就像你声明一个INT变量或任何其他默认数据类型一样。

DECLARE @T AS [dbo].[TestTableTypeName];

现在,变量@T是一个表变量,具有与为表类型[dbo].[TestTableTypeName]定义的表结构相同的表结构。

现在因为我们可以声明一个[dbo].[TestTableTypeName]类型的变量,我们也可以创建一个这种类型的过程输入变量。

像......这样的东西。

CREATE PROCEDURE myTestProc
 @Var1  INT 
,@T  AS [dbo].[TestTableTypeName] READONLY 
AS
.......  

存储过程myTestProc具有表类型@T的输入变量[dbo].[TestTableTypeName],这意味着我可以将表作为参数传递给此过程。

请注意,如果我需要对传递的表进行任何更改,则此表类型参数是只读的,我需要将数据放入临时表的另一个表变量中,然后对数据进行更改,等等向前。

对于您的情况,您需要创建一个表类型,表示与函数返回的表相同的表结构。像......那样......

表格类型

CREATE TYPE [dbo].[sp_agent_log_activity_tab]   
AS TABLE (  
Agent_Name      NVARCHAR(50),
Agent_Login_ID  NVARCHAR(50),
Agent_Extension NVARCHAR(50),
op1             NVARCHAR(1),
Login_Time      DATETIME2(3),
op2             NVARCHAR(1),
Logout_Time     DATETIME2(3),
Logout_Reason_Code SMALLINT,
Logon_Duration  INT,
latestSynchedTime DATETIME2(3)) 
GO 

现在让您的过程具有此类型的输入参数。

SP定义

CREATE PROCEDURE getAgentLogActivity 
  @T AS [dbo].[sp_agent_log_activity_tab] READONLY 
AS
BEGIN

    DECLARE @l_event_login SMALLINT
    DECLARE @l_event_logout SMALLINT
    DECLARE @l_eventtype SMALLINT
    DECLARE @l_reasoncode SMALLINT
    DECLARE @l_agentid INT

现在更改过程定义的其余部分以处理此表类型参数。

<强>执行

完成上述所有操作后,您将执行类似.....

的过程
Declare @T AS [dbo].[sp_agent_log_activity_tab];

INSERT INTO @t 
SELECT ColumnNames....
FROM sp_agent_log_activity (@param1 , @param2, @Param3....)

EXEC getAgentLogActivity @T =  @T
GO