【问题标题】:SQL Server 2008 table with data as parameter for UDF将数据作为 UDF 参数的 SQL Server 2008 表
【发布时间】:2023-03-22 11:27:01
【问题描述】:

我的问题:是否可以在 SQL Server 2008 中在存储过程中定义临时表并将其作为变量传递给用户定义的函数?

我需要做以下事情:

  1. 我有程序dbo.GetMsgCntData

  2. 这个过程正在进行一些计算,作为这个过程的结果,我将数据放入了这个过程中定义的临时表 (GetMsgCntData):

    -- table defined in dbo.GetMsgCntData
    DECLARE @tmpTable TABLE (
        ID BIGINT,
        FirstName VARCHAR(50),
        LastName VARCHAR(50),
        UserType varchar(50),
        SenderID bigint,
        IsArchive bit
    )
    
  3. 所以,@tmpTable 包含一些数据。 我需要运行用户定义函数GetCnt(@status, @MsgTempTable),但我需要getCnt 函数来访问@tmpTable 数据。基本上我需要这样的东西:

    -- to be written at the end of dbo.GetMsgCntData
    SELECT cnt(*) total,
        dbo.GetCnt('open', @tmpTable) as opened,
        dbo.GetCnt('closed', @tmpTable) as closed
    FROM @tmpTable
    -- where @tmpTable is temporal table
    
  4. 我尝试将GetCnt 中的@table 定义为用户定义类型。

    CREATE TYPE dbo.tmp_Messages AS TABLE (
        ID BIGINT,
        FirstName VARCHAR(50),
        LastName VARCHAR(50),
        UserType varchar(50),
        SenderID bigint,
        IsArchive bit
    )
    
    CREATE FUNCTION FUNCTION [dbo].[GetCnt] (
        @Status nvarchar(10),
        @MsgTempTable dbo.tmp_Messages READONLY
    )
    ....
    

但这给了我错误信息:

Operand type clash: table is incompatible with tmp_Messages

我认为我的想法完全不正确。

【问题讨论】:

    标签: sql-server-2008 tsql user-defined-functions table-valued-parameters


    【解决方案1】:

    临时表与用户自定义类型不兼容。 您应该将您的临时表声明为用户定义类型:

    CREATE TYPE dbo.tmp_Messages AS TABLE 
    (
     ID BIGINT,
     FirstName VARCHAR(50),
     LastName VARCHAR(50),
     UserType varchar(50),
     SenderID bigint,
     IsArchive bit
     )
     GO
     --function declaration 
    
            CREATE FUNCTION [dbo].[GetCnt] (
                @Status nvarchar(10),
                @MsgTempTable dbo.tmp_Messages READONLY
            )...
            -- table defined in dbo.GetMsgCntData
            DECLARE @tmpTable dbo.tmp_Messages;
            INSERT INTO @tmpTable(---some actions
    
    SELECT cnt(*) total,
        dbo.GetCnt('open', @tmpTable) as opened,
        dbo.GetCnt('closed', @tmpTable) as closed
    FROM @tmpTable
    

    请阅读一篇关于表值参数的好文章:http://beyondrelational.com

    【讨论】:

      【解决方案2】:

      您可以使用用户定义的表类型来实现这一点。试试这个

      CREATE TYPE T1Type
      AS TABLE (ID BIGINT,
          FirstName VARCHAR(50),
          LastName VARCHAR(50),
          UserType varchar(50),
          SenderID bigint,
          IsArchive bit
      )
      

      在你的 SP 中

      DECLARE @tmpTable T1Type
      INSERT INTO @tmpTable
      SELECT * FROm TableName
      

      在你的函数中

      CREATE FUNCTION FUNCTION [dbo].[GetCnt] (
          @Status nvarchar(10),
          @MsgTempTable T1Type READONLY
      )
      

      【讨论】:

        猜你喜欢
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多