SSRSを使用してレポートを作成し、ストアドプロシージャを実行してレポート用のデータを生成しています
DECLARE @return_value int
EXEC @return_value = [dbo].[MYREPORT]
@ComparePeriod = 'Daily',
@OverrideCompareDate = NULL,
@PortfolioId = '5,6',
@OverrideStartDate = NULL,
@NewPositionsOnly = NULL,
@SourceID = 13
SELECT 'Return Value' = @return_value
GO
上記で@PortfolioId = '5,6'
を渡したとき、それは間違った入力を与えています
portfolio id 5 and 6 also
のすべてのレコードが必要です。複数の値を送信するこの正しい方法ですか?
レポートを実行すると、@PortfolioId = '5'
のみが提供され、120個のレコードが提供されます。@PortfolioId = '6'
を提供して実行すると、70個のレコードが提供されます。
したがって、@PortfolioId = '5,6'
を提供する場合、合計で190件のレコードのみを提供する必要がありますが、私は正確にどこが間違っているのかわかりません。
誰も私を助けることができますか?ありがとう
すべてのコードは貼り付けるには大きすぎるため、関連するコードを貼り付けて手がかりを提案してください。
CREATE PROCEDURE [dbo].[GENERATE_REPORT]
(
@ComparePeriod VARCHAR(10),
@OverrideCompareDate DATETIME,
@PortfolioId VARCHAR(50) = '2', --this must be multiple
@OverrideStartDate DATETIME = NULL,
@NewPositionsOnly BIT = 0,
@SourceID INT = NULL
) AS
BEGIN
SELECT
Position.Date,
Position.SecurityId,
Position.Level1Industry,
Position.MoodyFacilityRating,
Position.SPFacilityRating,
Position.CompositeFacilityRating,
Position.SecurityType,
Position.FacilityType,
Position.Position
FROM
Fireball_Reporting.dbo.Reporting_DailyNAV_Pricing POSITION WITH (NOLOCK, READUNCOMMITTED)
LEFT JOIN Fireball.dbo.AdditionalSecurityPrice ClosingPrice WITH (NOLOCK, READUNCOMMITTED) ON
ClosingPrice.SecurityID = Position.PricingSecurityID AND
ClosingPrice.Date = Position.Date AND
ClosingPrice.SecurityPriceSourceID = @SourceID AND
ClosingPrice.PortfolioID IN (
SELECT
PARAM
FROM
Fireball_Reporting.dbo.ParseMultiValuedParameter(@PortfolioId, ',') )
これは簡単にはできません。 NVARCHAR
パラメーターが「複数の値」を取るようにする方法はありません。以前にやったことは-あなたが既にやっているように-コンマで区切られた値を持つリストのようなパラメーター値を作ります。次に、この文字列をストアドプロシージャの各部分に分割します。
分割は、文字列関数を使用して実行できます。すべての部分を一時テーブルに追加します。このための擬似コードは次のとおりです。
CREATE TABLE #TempTable (ID INT)
WHILE LEN(@PortfolioID) > 0
BEGIN
IF NOT <@PortfolioID contains Comma>
BEGIN
INSERT INTO #TempTable VALUES CAST(@PortfolioID as INT)
SET @PortfolioID = ''
END ELSE
BEGIN
INSERT INTO #Temptable VALUES CAST(<Part until next comma> AS INT)
SET @PortfolioID = <Everything after the next comma>
END
END
次に、条件を
WHERE PortfolioId IN (SELECT ID FROM #TempTable)
[〜#〜] edit [〜#〜]
SSRSの複数値パラメーターのドキュメントに興味があるかもしれません。
作成するレポートパラメーターには、複数値パラメーターを定義できます。ただし、クエリを使用して複数のパラメーター値をデータソースに戻す場合は、次の要件を満たす必要があります。
データソースは、SQL Server、Oracle、Analysis Services、SAP BI NetWeaver、またはHyperion Essbaseである必要があります。
データソースをストアドプロシージャにすることはできません。Reporting Servicesは、ストアドプロシージャへの複数値パラメータ配列の受け渡しをサポートしていません。
クエリでは、IN句を使用してパラメーターを指定する必要があります。
ユーザー定義テーブル を使用する
または、 この投稿 に従って独自のCSV関数を定義することにより、CSVを使用できます。
ストアドプロシージャは既に正しい形式で記述されているので、2番目の方法をお勧めします。これを後で行う必要がある場合は、後で便利になります。
乾杯!
これを使って
私はこの正確な問題をほぼ2週間にわたって抱えていましたが、非常にイライラしていましたが、このサイトを最終的に見つけ、何をすべきかを明確に説明しました。
http://blog.summitcloud.com/2010/01/multivalue-parameters-with-stored-procedures-in-ssrs-sql/
これがまさに私が探していたものだったからです。
適切な方法を見つけるのに時間を費やしました。これは他の人にとって役に立つかもしれません。
UDFを作成し、クエリで参照します-
http://www.geekzilla.co.uk/view5C09B52C-4600-4B66-9DD7-DCE840D64CBD.htm
以下の手順は、あなたが探しているものに役立つと思います。
CREATE PROCEDURE [dbo].[FindEmployeeRecord]
@EmployeeID nvarchar(Max)
AS
BEGIN
DECLARE @sqLQuery VARCHAR(MAX)
Declare @AnswersTempTable Table
(
EmpId int,
EmployeeName nvarchar (250),
EmployeeAddress nvarchar (250),
PostalCode nvarchar (50),
TelephoneNo nvarchar (50),
Email nvarchar (250),
status nvarchar (50),
Sex nvarchar (50)
)
Set @sqlQuery =
'select e.EmpId,e.EmployeeName,e.Email,e.Sex,ed.EmployeeAddress,ed.PostalCode,ed.TelephoneNo,ed.status
from Employee e
join EmployeeDetail ed on e.Empid = ed.iEmpID
where Convert(nvarchar(Max),e.EmpId) in ('+@EmployeeId+')
order by EmpId'
Insert into @AnswersTempTable
exec (@sqlQuery)
select * from @AnswersTempTable
END