2016-12-05 3 views
1

По какой-то причине я могу запустить свой оператор 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: enter image description here

И представляет собой ошибку:

enter image description here

В конструкторе запросов в SSRS, если я объявляю переменную вверху с несколькими параметрами значения, чем это работает.

DECLARE @ClassCode varchar(100) = '31439,739889,33528,40199,21289,40427,42594,5283,5251,34489' 

enter image description here

Но если я снимаю это заявление, чем я получаю ту же ошибку. Что здесь происходит?

+1

Начните с проверки данных Class Code, чтобы убедиться, что там нет необычных символов. Ищите запятые, а что нет, в списке классов классов. –

+0

Я использую данные из той же таблицы 'tblClassCodesPlazaCommercial' с той же функцией' [dbo]. [StringOfStringsToTable] 'в Production и работает отлично.Поэтому я предполагаю, что где-то в SSRS – Oleg

+0

. Похоже, что список кодов классов очень длинный, что может и не создавать цепочку длиной более 8000, и это все, что вы можете показать. Это возможно? Я чувствую, что это может быть причиной этого. Это странная ошибка. Возможно, вы можете попытаться ограничить количество опций в этом списке и посмотреть, не исчезла ли ошибка. –

ответ

1

Я знаю по опыту, что SSRS не любит временные таблицы. таблицы, начинающиеся с одного хэша (#).

Преобразуйте его в производную таблицу или глобальную таблицу и повторите попытку.

Here is a link to some examples

+0

Я использую SSRS ежедневно в течение последних восьми лет (все версии с момента добавления SQL Server 2000, выпущенного в 2004 году), а временные таблицы не были проблемой в любой версии. Я никогда не сталкивался с чем-то вроде «... SSRS не любит временные таблицы ...» раньше. Проблемы, описанные в ссылке выше, заставляют меня думать, что должно быть какое-то другое объяснение наблюдаемых явлений. – DatumPoint

+0

Таблицы Temp внутри SP отлично, но не при использовании для запроса запроса внутри SSRS. –

+0

Опять же, это просто неверно. Должен быть какой-то другой фактор в игре. – DatumPoint

1

Я согласен с предыдущим ответом. Временная таблица в вашем скрипте является проблемой.

Я считаю, что вы сделаете вашу жизнь намного легче, если вы сделаете свой скрипт в Хранимой процедуре на сервере. Затем создайте свой набор данных в SSRS, подключившись к хранимой процедуре. Тогда он будет обрабатывать несколько параметров.

1

Благодарим вас за рекомендации. Я обязательно включу свой код в SP и выйду с помощью #TempTables при работе с SSRS. Но я также нашел решение для моей проблемы, modifiing параметр на моем dataset.So вместо @Parameters параметров по умолчанию ClassCode.Value Я использовал JOIN функцию:

=Join(Parameters!ClassCode.Value,",") 

enter image description here

Вот ссылка для получения дополнительной информации:

https://technicalreflections.wordpress.com/2011/05/12/ssrs-parameters-and-sql-functionsstored-procedures/

Спасибо за помощь

Смежные вопросы