По какой-то причине я могу запустить свой оператор SELECT
в SSMS, но когда я его использую в SSRS, тогда он говорит Procedure or function has too many arguments specified
. Если я выберу только один параметр - это даст мне результат. Но если я выберу 2 или более - у меня есть ошибка.В процедуре или функции указано слишком много аргументов SSRS
Это весь мой код:
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
Это результат установлен в SSMS:
И представляет собой ошибку:
В конструкторе запросов в SSRS, если я объявляю переменную вверху с несколькими параметрами значения, чем это работает.
DECLARE @ClassCode varchar(100) = '31439,739889,33528,40199,21289,40427,42594,5283,5251,34489'
Но если я снимаю это заявление, чем я получаю ту же ошибку. Что здесь происходит?
Начните с проверки данных Class Code, чтобы убедиться, что там нет необычных символов. Ищите запятые, а что нет, в списке классов классов. –
Я использую данные из той же таблицы 'tblClassCodesPlazaCommercial' с той же функцией' [dbo]. [StringOfStringsToTable] 'в Production и работает отлично.Поэтому я предполагаю, что где-то в SSRS – Oleg
. Похоже, что список кодов классов очень длинный, что может и не создавать цепочку длиной более 8000, и это все, что вы можете показать. Это возможно? Я чувствую, что это может быть причиной этого. Это странная ошибка. Возможно, вы можете попытаться ограничить количество опций в этом списке и посмотреть, не исчезла ли ошибка. –