2

私の質問: 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
    )
    ....
    

しかし、これは私にエラーメッセージを与えます:

Operand type clash: table is incompatible with tmp_Messages

私の考えは単に間違っていると思います。

4

2 に答える 2

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

于 2013-01-29T19:44:25.150 に答える
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
)
于 2013-01-29T19:39:58.693 に答える