【问题标题】:Execute procedure by passing input to procedure from function in SQL Server通过将输入从 SQL Server 中的函数传递给过程来执行过程
【发布时间】:2017-03-12 16:03:25
【问题描述】:

这里只是给你一个背景,我正在做的是我有 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

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

【问题讨论】:

  • this question没有评论?至少这一篇比上一篇提供了更多详细信息。
  • @scsimon 这是一个不同的问题。
  • @M.Ali 你能告诉我上面的情况如何
  • @AbdulquadirShaikh 如果您阅读过文档,您就不会要求我解释了。

标签: sql sql-server function stored-procedures


【解决方案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  

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

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

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

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

有点像.....

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

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

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

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

表格类型

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

【讨论】:

  • 谢谢,我明白我必须做什么了。我只想为@param 包含函数返回的列。如果是,那么我将收到一个错误,其中包含的列的列名无效,例如 Agent_Name、Agent_Login_Id。我也收到错误,因为“指定的参数太多”谢谢
猜你喜欢
  • 2021-04-28
  • 2015-08-20
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
相关资源
最近更新 更多