allow null 値を設定することで、データセットが次のように見えることを示しています。
CREATE PROCEDURE myRSStoredProcedure
@MyParameter varchar(50)=NULL
--more code
SELECT * FROM MyTable WHERE (MyField=@MyParameter OR @MyParameter IS NULL)
END
つまり、NULL は有効な値であり、ストアド プロシージャのどこかで参照されWHERE (MyField=@MyParameter OR @MyParameter IS NULL)
ています。これが値または NULL に対して処理する部分に注意してください。を含めOR @MyParameter IS NULL
ないでWHERE MyField=@MyParameter
、RS に対処していないことを考慮して、RS が "Allow Nulls" をどのように期待するかだけです。
複数の値を許可する場合、これは複数の選択を許可する Reporting Services の唯一の指標です。データセット (ストアド プロシージャ) でカンマ区切り値を処理する必要があります。次のように言うことはできません。
SELECT * FROM MyTable WHERE ID IN (@MyParam)
そのようには機能しません。これを修正する方法として、CSV リストを受け取り、整数のテーブルを返すテーブル値関数を作成する必要があります。以下に例を示します。
CREATE Function [dbo].[CsvToInt] ( @Array varchar(1000))
returns @IntTable table
(IntValue int)
--Parse comma seperated value parameters
--To be used in SELECT blah WHERE blah IN (...)
--This function returns int, but may be modified to return any datatype
AS
begin
declare @separator char(1)
set @separator = ','
declare @separator_position int
declare @array_value varchar(1000)
set @array = @array + ','
while patindex('%,%' , @array) <> 0
begin
select @separator_position = patindex('%,%' , @array)
select @array_value = left(@array, @separator_position - 1)
Insert @IntTable
Values (Cast(@array_value as int))
select @array = stuff(@array, 1, @separator_position, '')
end
return
end
最後に、空の選択とは対照的に「すべて」のデータを含める巧妙な方法は、2 つのデータセットを作成することです。最初のデータセットは、たとえば次の顧客のパラメータです。
SELECT
1 As SortOrder
CustomerID,
Customer
FROM
MyCustomers
UNION ALL
SELECT
0 As SortOrder
0 As CustomerID,
'All' As Customer
ORDER BY
SortOrder,
Customer
これにより、上部に All という単語を持つすべての顧客が一覧表示されます (SortOrder に注意してください)。次に、RS レポート パラメータで、デフォルト値を 0 (CustomerID を使用しているAll
場合) または (実際の顧客名を使用している場合) として指定できます。レポート データセットは次のようになります。
CREATE PROCEDURE rsp_MainReport
@CustomerID int = 0 --this could also be @CustomerID varchar(50)='All'
--more code
SELECT Blah FROM MyTable WHERE (CustomerID = @CustomerID OR @CustomerID=0)
--or you could of done WHERE (Customer = @Customer OR @Customer='All')
私があなたのために行った例を投稿します。パラメータデータセットは次のとおりです。
SELECT
1 as SortOrder,
FacilityID,
Facility
FROM
Facility
UNION ALL
SELECT
0 as SortOrder,
0 as FacilityID,
'All' as Facility
ORDER BY
SortOrder,
Facility
次の結果が得られます。

次に、それをメイン データセット (レポートのデータセット) で使用できます。
CREATE PROCEDURE rsp_QuikFixStats_ByFacilityCategory
-- Add the parameters for the stored procedure here
@FacilityID bigint=0,
@StartDate datetime=NULL,
@EndDate datetime=NULL
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT
f.Facility,
c.Category,
COUNT(t.TicketID) AS TotalNumberOfTickets,
SUM(CASE WHEN ClosedDate IS NULL AND TargetDate IS NOT NULL THEN 1 ELSE 0 END) AS TotalNumberOfOpenTickets,
SUM(CASE WHEN ClosedDate IS NOT NULL THEN 1 ELSE 0 END) AS TotalNumberOfClosedTickets,
SUM(CASE WHEN TargetDate IS NULL AND ClosedDate IS NULL THEN 1 ELSE 0 END) AS TotalNumberOfWaitForTickets,
SUM(CASE WHEN TargetDate IS NOT NULL AND ClosedDate IS NULL AND TargetDate < GetDate() THEN 1 ELSE 0 END) AS TotalNumberOfOverdueTickets
FROM
Ticket t
INNER JOIN
Facility f
ON
f.FacilityID = t.FacilityID
INNER JOIN
Category c
ON
c.CategoryID = t.CategoryID
WHERE
(f.Inactive=0)
AND (f.FacilityID = @FacilityID OR @FacilityID=0)
AND (t.OpenDate >= @StartDate OR @StartDate IS NULL)
AND (t.OpenDate <= @EndDate OR @EndDate IS NULL)
GROUP BY
f.Facility,
c.Category
ORDER BY
f.Facility,
COUNT(t.TicketID) DESC,
c.Category
END
GO
レポート パラメータは次のようになります。
