Ich verwende SSRS zum Berichten und Ausführen einer gespeicherten Prozedur, um die Daten für meine Berichte zu generieren
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
Wenn ich @PortfolioId = '5,6'
übergeben habe, werden mir falsche Eingaben gemacht
Ich brauche alle Datensätze für portfolio id 5 and 6 also
Ist dies die richtige Art, mehrere Werte zu senden?
Wenn ich meine Berichte nur mit @PortfolioId = '5'
ausführe, gibt es mir 120 Datensätze Wenn ich sie mit @PortfolioId = '6'
ausführe, gibt es mir 70 Datensätze
Wenn ich also @PortfolioId = '5,6'
geben werde, sollte es mir nur 190 Datensätze geben müssen, aber es gibt mir mehr Datensätze. Ich verstehe nicht, wo ich genau schief gehe.
Könnte mir jemand helfen? Danke
der gesamte Code ist zu groß zum Einfügen. Ich füge relevanten Code ein.
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, ',') )
Dies kann nicht leicht gemacht werden. Es gibt keine Möglichkeit, für einen NVARCHAR
-Parameter "mehr als einen Wert" zu verwenden. Was ich zuvor gemacht habe, ist - wie Sie es bereits getan haben - den Parameterwert wie eine Liste mit durch Kommas getrennten Werten zu machen. Teilen Sie dann diese Zeichenfolge in der gespeicherten Prozedur in ihre Teile auf.
Die Aufteilung kann mit Stringfunktionen erfolgen. Fügen Sie jeden Teil einer temporären Tabelle hinzu. Pseudo-Code dafür könnte sein:
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
Ändern Sie dann Ihren Zustand in
WHERE PortfolioId IN (SELECT ID FROM #TempTable)
EDIT
Möglicherweise interessieren Sie sich für die Dokumentation zu Parametern mit mehreren Werten in SSRS, in der es heißt:
Sie können einen mehrwertigen Parameter für jeden Berichtsparameter definieren, der du erschaffst. Wenn Sie jedoch mehrere Parameterwerte übergeben möchten Zurück zu einer Datenquelle mithilfe der Abfrage die folgenden Anforderungen muss zufrieden sein:
Die Datenquelle muss SQL Server, Oracle, Analysis Services und SAP BI sein NetWeaver oder Hyperion Essbase.
Die Datenquelle kann keine gespeicherte Prozedur sein. Reporting Services macht das nicht die Übergabe eines mehrwertigen Parameterarrays an ein gespeichertes Verfahren.
Die Abfrage muss eine IN-Klausel verwenden, um den Parameter anzugeben.
Entweder eine Benutzerdefinierte Tabelle verwenden
Oder Sie können CSV verwenden, indem Sie Ihre eigene CSV-Funktion gemäß This Post definieren.
Ich würde wahrscheinlich die zweite Methode empfehlen, da Ihre gespeicherte Prozedur bereits im korrekten Format geschrieben ist und Sie sich später als nützlich erweisen werden, wenn Sie dies später tun müssen.
Prost!
Ich habe viel Zeit damit verbracht, einen richtigen Weg zu finden. Dies kann für andere nützlich sein.
Erstellen Sie eine UDF und verweisen Sie in der Abfrage -
http://www.geekzilla.co.uk/view5C09B52C-4600-4B66-9DD7-DCE840D64CBD.htm
Ich denke, das unten beschriebene Verfahren hilft Ihnen, wonach Sie suchen.
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 ('[email protected]+')
order by EmpId'
Insert into @AnswersTempTable
exec (@sqlQuery)
select * from @AnswersTempTable
END
BENUTZE DAS
Ich hatte dieses genaue Problem seit fast zwei Wochen, extrem frustrierend, aber ich fand diese Seite ENDLICH und es war ein klarer Schritt durch das, was zu tun ist.
http://blog.summitcloud.com/2010/01/multivalue-parameters-with-stored-procedures-in-ssrs-sql/
Ich hoffe, das hilft den Leuten, weil es genau das war, wonach ich gesucht habe