如何将多个值传递给存储过程中的单个参数
Posted
技术标签:
【中文标题】如何将多个值传递给存储过程中的单个参数【英文标题】:How to pass multiple values to single parameter in stored procedure 【发布时间】:2012-12-07 13:25:09 【问题描述】:我正在使用 s-s-rS 进行报告并执行存储过程来为我的报告生成数据
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, ',') )
【问题讨论】:
您能否向我们展示存储过程的签名(您的参数是什么名称和数据类型),以及您如何在存储过程中使用该参数@PortfolioId
?
嗨,marc_s 实际上我正在使用 s-s-rS 报告报告我有下拉列表,其中包含所有带有复选框的投资组合名称。我可以同时选择多个投资组合,所以如果我没记错的话,它将像这样传递到上述程序。那么为什么我得到更多的记录而不是添加 5 和 6 个投资组合
【参考方案1】:
这不是一件容易的事。没有办法让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)
编辑 您可能对 s-s-rS 中多值参数的文档感兴趣,其中指出:
您可以为任何报告参数定义一个多值参数, 你创造。但是,如果要传递多个参数值 使用查询返回数据源,有以下要求 必须满足:
数据源必须是 SQL Server、Oracle、Analysis Services、SAP BI NetWeaver 或 Hyperion Essbase。
数据源不能是存储过程。 Reporting Services 可以 不支持将多值参数数组传递给存储的 过程。
查询必须使用 IN 子句来指定参数。
This I found here.
【讨论】:
嗨,实际上我正在使用 s-s-rS 报告报告,我有一个下拉列表,其中包含所有带有复选框的投资组合名称。我可以同时选择多个投资组合,所以如果我没记错的话,它将像这样传递到上述程序。那么为什么我得到更多的记录而不是添加 5 和 6 个投资组合 你确定参数是按照你的假设传递的吗?为了回答,看看存储过程的代码会很有趣。【参考方案2】:使用这个
我已经遇到这个确切的问题将近 2 周了,非常令人沮丧,但我终于找到了这个网站,它清楚地说明了该怎么做。
http://blog.summitcloud.com/2010/01/multivalue-parameters-with-stored-procedures-in-s-s-rs-sql/
我希望这对人们有所帮助,因为这正是我想要的
【讨论】:
Wayback 机器链接,因为站点已关闭/离线web.archive.org/web/20150825052838/http://blog.summitcloud.com/…【参考方案3】:要么使用User Defined Table
或者您可以通过按照This Post 定义自己的 CSV 函数来使用 CSV。
我可能会推荐第二种方法,因为您的存储过程已经以正确的格式编写,如果您以后需要这样做,您会发现它很方便。
干杯!
【讨论】:
【参考方案4】:我花时间寻找合适的方法。这可能对其他人有用。
创建一个 UDF 并在查询中引用 -
http://www.geekzilla.co.uk/view5C09B52C-4600-4B66-9DD7-DCE840D64CBD.htm
【讨论】:
Soumyendra,也许编辑你的答案,提取链接中的信息,以防链接将来变坏?【参考方案5】:我认为,下面的过程可以帮助您找到所需的内容。
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
【讨论】:
始终欢迎提供指向潜在解决方案的链接,但请add context around the link,以便您的其他用户知道它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。考虑到仅仅是指向外部网站的链接是Why and how are some answers deleted? 的一个可能原因。 另请注意same answer 已在大约一年前发布(并删除)。如果与问题相关,可以链接到您自己的博客或网站,但请记住,答案独立存在而不需要访问外部网站很方便。如果有的话,最好明确说明您与该网站的关系。 我会比“方便”走得更远,并说答案的先决条件是包含足够的信息来回答问题而无需点击链接。链接应仅供参考或归属,而不是答案本身。以上是关于如何将多个值传递给存储过程中的单个参数的主要内容,如果未能解决你的问题,请参考以下文章