我正在使用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, ',') )
答案 0 :(得分:10)
这不容易做到。没有办法让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)
修改强>
您可能对SSRS中多值参数的文档感兴趣,其中指出:
您可以为任何报告参数定义多值参数 你创造。但是,如果要传递多个参数值 通过使用查询返回数据源,具有以下要求 必须满意:
数据源必须是SQL Server,Oracle,Analysis Services,SAP BI NetWeaver,或Hyperion Essbase。
数据源不能是存储过程。 Reporting Services可以 不支持将多值参数数组传递给存储的数组 过程
查询必须使用IN子句指定参数。
答案 1 :(得分:2)
使用这个
我已经有了近两个星期的确切问题,非常令人沮丧,但我最终找到了这个网站,这是一个明确的步骤,了解该怎么做。
http://blog.summitcloud.com/2010/01/multivalue-parameters-with-stored-procedures-in-ssrs-sql/
我希望这有助于人们,因为它正是我所寻找的
答案 2 :(得分:1)
答案 3 :(得分:1)
我认为,以下程序可以帮助您找到您想要的内容。
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
答案 4 :(得分:1)
我花了一些时间寻找正确的方法。这可能对其他人有用。
创建UDF并引用查询-
http://www.geekzilla.co.uk/view5C09B52C-4600-4B66-9DD7-DCE840D64CBD.htm