为了给你一个背景,我正在做的是我有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
如果有人能指导我如何从函数输入参数到程序,我会很高兴。
答案 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