Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server 2008表,数据作为UDF的参数_Sql Server 2008_Tsql_User Defined Functions_Table Valued Parameters - Fatal编程技术网

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

Sql server 2008 SQL Server 2008表,数据作为UDF的参数,sql-server-2008,tsql,user-defined-functions,table-valued-parameters,Sql Server 2008,Tsql,User Defined Functions,Table Valued Parameters,我的问题:在SQL Server 2008中,是否可以在存储过程中定义时态表,并将其作为变量传递给用户定义的函数 我需要做以下工作: 我有一个过程dbo.GetMsgCntData 此过程正在进行一些计算,因此,我将数据放入在此过程中定义的临时表(GetMsgCntData): 因此,@tmpTable包含一些数据。 我需要运行用户定义的函数GetCnt(@status,@MsgTempTable),但我需要GetCnt函数来访问@tmpTable数据。基本上我需要这样的东西: -- to b

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

我需要做以下工作:

  • 我有一个过程
    dbo.GetMsgCntData

  • 此过程正在进行一些计算,因此,我将数据放入在此过程中定义的临时表(
    GetMsgCntData
    ):

  • 因此,
    @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
    
  • 我试图在
    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
    

    我认为我的想法根本不正确。

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

    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
    )
    

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

    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
    
    请阅读一篇关于表值参数的好文章:

    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