1

会社のプロジェクトのレポート モジュールに取り組んでいます。アプリケーションには ORM を使用していますが、SSRS への移行を見越して、レポート用のストアド プロシージャを作成することにしました。

これらのストアド プロシージャには、テーブル値パラメーターの入力が必要です。そのため、テーブルタイプを作成しました:

USE MyDatabase
GO

/****** Object:  UserDefinedTableType [dbo].[IntList]    Script Date: 5/8/2013 5:20:59 PM ******/
CREATE TYPE [dbo].[IntList] AS TABLE(
    [Id] [int] NOT NULL,
    PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO

次の SQL Server ストアド プロシージャがあります。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
USE MyDatabase
GO
-- =============================================
-- Author:      <lunchmeat317>
-- Create date: <05/06/2013>
-- Description: <File Type Report>
-- =============================================
ALTER PROCEDURE Report_FileType 
    @filetype varchar(20) = null,
    @User intList READONLY,
    @Group intList READONLY
AS
BEGIN
    SET NOCOUNT ON;

    /*
    lf = LibraryFile
    lfu = LibraryFileAssignedUser
    lfg = LibraryFileAssignedGroup
    */

    SELECT Extension AS FileType, COUNT(1) AS TotalFiles
    FROM LibraryFile lf
    LEFT JOIN LibraryFileAssignedUser lfu
        ON (SELECT COUNT(1) FROM @User) != 0
        AND lfu.LibraryFileId = lf.Id
    LEFT JOIN LibraryFileAssignedGroup lfg
        ON (SELECT COUNT(1) FROM @Group) != 0
        AND lfg.LibraryFileId = lf.Id
    WHERE ((@filetype IS NULL) OR (Extension = @filetype))
    AND (
        ((@User IS NULL) OR (lfu.UserId IN (SELECT * FROM @User)))
        OR ((@Group IS NULL) OR (lfg.HubGroupId IN (SELECT * FROM @Group)))
    )
    GROUP BY Extension
END
GO

ストアド プロシージャを変更しようとすると、継続的にエラー メッセージが表示される

Msg 137, Level 16, State 1, Procedure Report_FileType
Must declare the scalar variable "@User".
Msg 137, Level 16, State 1, Procedure Report_FileType
Must declare the scalar variable "@Group".

なぜこれが起こっているのかわかりません。スカラー型を使用した場合 (および一致するようにコードを更新した場合) は機能します。ただし、TVP を使用しようとすると、ストアド プロシージャをコンパイルできません。

価値のあるものとして、タイプを追加しましたが、まだアクセス許可を設定していません。ただし、それによってコンパイル エラーが発生するとは思いません。実行時にのみエラーが発生します(以前に対処しました)。

誰もこの問題の経験がありますか? ありがとう!

4

1 に答える 1

1

@User / @Group IS NULL興味深いことに、これは以前に使用したことがありませんが、テーブルであるためテストできないようです。
参照。

https://dba.stackexchange.com/questions/30754/how-do-i-check-for-a-null-or-empty-table-valued-parameter

http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/c59f6b82-7639-42c7-ad90-a4ec7315a3bd/

于 2013-05-09T17:52:41.050 に答える