2016-12-05 114 views
1

出於某種原因,我能夠在SSMS中運行我的SELECT聲明,但是當我在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

首先檢查您的班級代碼數據以確保在那裏沒有不尋常的字符。在「班級代碼」列表中查找逗號以及哪些不是。 –

+0

我正在使用來自同一個函數'[dbo]。[StringOfStringsToTable]'在生產中的同一個表'tblClassCodesPlazaCommercial'的數據,它工作正常。所以我假設SSRS中某處的原因 – Oleg

+0

看起來類代碼列表很長,這可能會創建一個超過8000的字符串,這是您顯示的所有功能都可以處理的。那可能嗎?我覺得這可能會導致這種情況。這是一個奇怪的錯誤。也許您可以嘗試限制該列表中的選項數量,並查看錯誤是否消失。 –

回答

1

我從經驗中知道SSRS不喜歡臨時表。以單個哈希(#)開頭的表。

請將其轉換爲派生表或全局表,然後重試。

Here is a link to some examples

+0

我過去8年來一直在使用SSRS(自2004年發佈SQL Server 2000加載項以來的所有版本),並且臨時表在任何版本中都沒有問題。我從來沒有遇到過像「...... SSRS不喜歡臨時表......」之類的東西。上面鏈接中描述的問題使我認爲對觀察到的現象必須有其他解釋。 – DatumPoint

+0

SP內的臨時表格很好,但不適合用於在SSRS內寫入查詢 –

+0

同樣,這根本不正確。必須發揮其他一些因素。 – DatumPoint

1

我同意上一個答案。腳本中的臨時表是一個問題。

我相信如果您將腳本變爲服務器上的存儲過程,您將使您的生活更加輕鬆。然後通過連接到存儲過程在SSRS中創建您的數據集。它會很好地處理多個參數。

相關問題