出于某种原因,我能够在SSMS中运行我的SELECT
语句,但是当我在SSRS中使用它时,它会说Procedure or function has too many arguments specified
。
如果我只选择一个参数 - 它会给我结果。但如果我选择2个或更多 - 我得到一个错误。
这是我的全部代码:
DECLARE @ClassCode varchar(max) = '31439,739889'
CREATE TABLE #PolicyNumbers (PolicyNumber varchar(50))
INSERT INTO #PolicyNumbers SELECT PolicyNumber FROM tblClassCodesPlazaCommercial T1
WHERE NOT EXISTS (SELECT 1 FROM tblClassCodesPlazaCommercial T2
WHERE T1.PolicyNumber = T2.PolicyNumber
AND ClassCode IN
(SELECT * FROM [dbo].[StringOfStringsToTable](@ClassCode,',')))
; WITH Earned_to_date AS (
SELECT Cast('11-30-2016' AS DATE) AS Earned_to_date
), policy_data AS (
SELECT
PolicyNumber
, Cast(PolicyEffectiveDate AS DATE) AS PolicyEffectiveDate
, Cast(PolicyExpirationDate AS DATE) AS PolicyExpirationDate
, WrittenPremium
FROM PlazaInsuranceWPDataSet pid
WHERE NOT EXISTS (SELECT PolicyNumber FROM #PolicyNumbers pn WHERE pn.PolicyNumber = pid.PolicyNumber )
AND State IN ('CA','NV','AZ')
)
, digits AS (
SELECT digit
FROM (VALUES (0), (1), (2), (3), (4)
, (5), (6), (7), (8), (9)) AS z2 (digit)
), numbers AS (
SELECT 1000 * d4.digit + 100 * d3.digit + 10 * d2.digit + d1.digit AS number
FROM digits AS d1
CROSS JOIN digits AS d2
CROSS JOIN digits AS d3
CROSS JOIN digits AS d4
), calendar AS (
SELECT
DateAdd(month, number, '1753-01-01') AS month_of
, DateAdd(month, number, '1753-02-01') AS month_after
FROM numbers
), policy_dates AS (
SELECT
PolicyNumber
, CASE
WHEN month_of < PolicyEffectiveDate THEN PolicyEffectiveDate
ELSE month_of
END AS StartRiskMonth
, CASE
WHEN PolicyExpirationDate < month_after THEN PolicyExpirationDate
WHEN Earned_to_date.Earned_to_date < month_after THEN Earned_to_date
ELSE month_after
END AS EndRiskMonth
, DateDiff(day, PolicyEffectiveDate, PolicyExpirationDate) AS policy_days
, WrittenPremium
FROM policy_data
JOIN calendar
ON (policy_data.PolicyEffectiveDate < calendar.month_after
AND calendar.month_of < policy_data.PolicyExpirationDate)
CROSS JOIN Earned_to_date
WHERE month_of < Earned_to_date
)
SELECT PolicyNumber,
--ClassCode,
Year(StartRiskMonth) as YearStartRisk,
Month(StartRiskMonth) as MonthStartRisk,
c.YearNum,c.MonthNum,
convert(varchar(7), StartRiskMonth, 120) as RiskMonth,
sum(WrittenPremium * DateDiff(day, StartRiskMonth, EndRiskMonth) / policy_days) as EarnedPremium
FROM tblCalendar c
LEFT JOIN policy_dates l ON c.YearNum=Year(l.StartRiskMonth) and c.MonthNum = Month(l.StartRiskMonth) AND l.StartRiskMonth BETWEEN '01-01-2012' AND '10-31-2016'
WHERE c.YearNum Not IN (2017) --and PolicyNumber = 'PACA1000191-00'
GROUP BY convert(varchar(7), StartRiskMonth, 120),
Year(StartRiskMonth) , Month(StartRiskMonth),
c.YearNum,c.MonthNum,PolicyNumber
ORDER BY PolicyNumber,c.YearNum,c.MonthNum
DROP TABLE #PolicyNumbers
我正在使用正常工作的split函数:
ALTER FUNCTION [dbo].[StringOfStringsToTable]
(
@Strings varchar(8000),
@Separator char(1)
)
RETURNS @StringTable table (String varchar(500))
AS
BEGIN
DECLARE @String varchar(500), @Pos int
SET @Strings = LTRIM(RTRIM(@Strings))+ @Separator
SET @Pos = CHARINDEX(@Separator, @Strings, 1)
WHILE @Pos > 0
BEGIN
SET @String = LTRIM(RTRIM(LEFT(@Strings, @Pos - 1)))
IF @String <> '' INSERT INTO @StringTable VALUES (@String)
SET @Strings = RIGHT(@Strings, LEN(@Strings) - @Pos)
SET @Pos = CHARINDEX(@Separator, @Strings, 1)
END
RETURN
END
有一个错误:
在SSRS中的查询设计器中,如果我在顶部使用多个值参数声明变量而不是它的工作原理。
DECLARE @ClassCode varchar(100) = '31439,739889,33528,40199,21289,40427,42594,5283,5251,34489'
但是,如果我取消该陈述而不是收到同样的错误。 这是怎么回事?
答案 0 :(得分:3)
谢谢你们的建议。在使用SSRS时,我肯定会将我的代码包装到SP中并使用#TempTables退出。
但我也通过修改我的数据集上的参数找到了解决我问题的方法。而不是默认参数@Parameters!ClassCode.Value我使用了JOIN
函数:
=Join(Parameters!ClassCode.Value,",")
以下是其他信息的链接:
感谢您的帮助
答案 1 :(得分:2)
我同意之前的回答。脚本中的临时表是个问题。
如果您将脚本设置为服务器上的存储过程,我相信您将使您的生活更轻松。然后通过连接到存储过程在SSRS中创建数据集。它会很好地处理多个参数。
答案 2 :(得分:0)
答案 3 :(得分:0)
在我的报告中使用JOIN(!Parameters!someparameter.Value, ",")
可以正常工作。
称为SP的报告,在SP中的参数由Split table函数解析,然后加入列以充当过滤器。
答案 4 :(得分:0)
为清楚起见,我相信此线程在临时表中得出了错误的结论。
我相信这里的问题(我有同样的问题)是逗号之间的空格。当您输入不带空格的字符串而只是逗号时,它可以工作,但是当您在参数部分(例如,如果您复制粘贴)中输入字符串时,通常以不同的行隔开。将其拉回到逗号分隔的值时,SSRS在每个之间添加一个空格。然后它不起作用。我不确定幕后到底发生了什么,但我知道在空间破损的情况下,如果没有它们,它会起作用。这说明了您介绍的所有情况。您还可以通过参数中的join找到解决方案!就我而言,可能是最相似的情况,代码很简单
join(parameter, ", ")
使用您可以粘贴带空格或不带空格的值,它应该可以工作!希望这能消除任何混乱!