SQL Server 2008表,数据作为UDF的参数

时间:2013-01-29 18:56:12

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

我的问题:在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. 我尝试将@table中的GetCnt定义为用户定义的类型。

    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
    )
    ....
    
  5. 但是这给了我错误信息:

    Operand type clash: table is incompatible with tmp_Messages
    

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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
)