【发布时间】:2016-12-05 23:25:24
【问题描述】:
由于某种原因,我能够在 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
我正在使用可以正常工作的拆分功能:
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'
但是,如果我取消该声明,则会收到相同的错误。 这是怎么回事?
【问题讨论】:
-
首先检查您的类代码数据以确保其中没有异常字符。在“类代码”列表中查找逗号,以及什么不是。
-
我在生产中使用来自同一张表
tblClassCodesPlazaCommercial的数据和相同的功能[dbo].[StringOfStringsToTable],它工作正常。所以我假设原因在 SSRS 中的某个地方 -
看起来类代码列表很长,可能会创建一个超过 8000 的字符串,这是您展示的所有功能可以处理的。这可能吗?我觉得这可能是造成这种情况的原因。这是一个奇怪的错误。也许您可以尝试限制该列表中的选项数量,看看错误是否消失。
-
谢谢,我知道你在说什么,但我尝试只选择 2 个值。和它一样。这里缺少一些东西。
-
您是否在 RDL 的查询中向 UDF 传递了超过 2 个参数?这是我认为现在会发生这种情况的唯一原因。
标签: sql-server function tsql reporting-services