J'utilise SSRS pour la création de rapports et l'exécution d'une procédure stockée afin de générer les données pour mes rapports.
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
Dans ce qui précède, lorsque j'ai passé @PortfolioId = '5,6'
, cela me donne de mauvaises entrées
J'ai besoin de tous les enregistrements pour portfolio id 5 and 6 also
. Est-ce la bonne façon d'envoyer les multiples valeurs?
Lorsque j'exécute mes rapports en ne donnant que @PortfolioId = '5'
, cela me donne 120 enregistrements Et lorsque je l'exécute en donnant @PortfolioId = '6'
, je m'en donne 70
Donc, quand je donnerai @PortfolioId = '5,6'
, il ne devrait me donner que 190 enregistrements au total, mais cela ne me donne plus aucun enregistrement que je ne comprends pas où je me trompe.
Quelqu'un pourrait-il m'aider?
tout le code est trop énorme pour être collé, je suis en train de coller du code pertinent, s'il vous plaît.
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, ',') )
Cela ne peut pas être fait facilement. Il n'y a aucun moyen de faire en sorte qu'un paramètre NVARCHAR
prenne "plus d'une valeur". Ce que j'ai déjà fait est, comme vous le faites déjà, de définir le paramètre comme une liste de valeurs séparées par des virgules. Ensuite, divisez cette chaîne en ses parties dans la procédure stockée.
La scission peut être effectuée à l'aide de fonctions de chaîne. Ajouter chaque partie à une table temporaire. Le pseudo-code pour cela pourrait être:
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
Ensuite, changez votre condition pour
WHERE PortfolioId IN (SELECT ID FROM #TempTable)
MODIFIER
La documentation pour les paramètres à valeurs multiples dans SSRS pourrait vous intéresser:
Vous pouvez définir un paramètre à valeurs multiples pour tout paramètre de rapport qui tu crées. Toutefois, si vous souhaitez transmettre plusieurs valeurs de paramètre Retour à une source de données à l'aide de la requête, les exigences suivantes doit être satisfait:
La source de données doit être SQL Server, Oracle, Analysis Services, SAP BI NetWeaver ou Hyperion Essbase.
La source de données ne peut pas être une procédure stockée. Reporting Services fait le supporte pas le passage d’un tableau de paramètres à valeurs multiples à un .__ stocké. procédure.
La requête doit utiliser une clause IN pour spécifier le paramètre.
Soit utiliser un User Defined Table
Ou vous pouvez utiliser CSV en définissant votre propre fonction CSV comme indiqué dans Ce message .
Je recommanderais probablement la deuxième méthode, car votre proc stocké est déjà écrit dans le format correct et vous le retrouverez plus tard si vous avez besoin de le faire plus tard.
À votre santé!
J'ai passé du temps à trouver le bon chemin. Cela peut être utile pour les autres.
Créer un fichier UDF et faire référence à la requête -
http://www.geekzilla.co.uk/view5C09B52C-4600-4B66-9DD7-DCE840D64CBD.htm
Je pense que la procédure ci-dessous vous aide à trouver ce que vous recherchez.
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
UTILISEZ CECI
Cela fait presque deux semaines que je suis confronté à ce problème, extrêmement frustrant, mais j'ai finalement trouvé ce site, qui expliquait clairement ce qu'il fallait faire.
http://blog.summitcloud.com/2010/01/multivalue-parameters-with-stored-procedures-in-ssrs-sql/
J'espère que cela aide les gens parce que c'était exactement ce que je cherchais