【问题标题】:Procedure or function has too many arguments specified SSRS过程或函数指定的参数过多 SSRS
【发布时间】: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
    

这是 SSMS 中的结果集:

还有一个错误:

在 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


【解决方案1】:

谢谢大家的推荐。在使用 SSRS 时,我肯定会将我的代码包装到 SP 中并使用 #TempTables 退出。 但我也通过修改我的数据集上的参数找到了我的问题的解决方案。所以我使用JOIN函数而不是默认参数@Parameters!ClassCode.Value:

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

这里是附加信息的链接:

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

感谢您的帮助

【讨论】:

    【解决方案2】:

    我同意前面的回答。脚本中的临时表有问题。

    我相信,如果您将脚本制作成服务器上的存储过程,您的生活将会变得更加轻松。然后通过连接到存储过程在 SSRS 中创建数据集。它将很好地处理多个参数。

    【讨论】:

      【解决方案3】:

      我从经验中知道 SSRS 不喜欢临时表。以单个哈希 (#) 开头的表。

      请将其转换为派生表或全局表,然后重试。

      Here is a link to some examples

      【讨论】:

      • 过去八年来我每天都在使用 SSRS(自 2004 年发布的 SQL Server 2000 附加组件以来的所有版本),临时表在任何版本中都没有问题。我以前从未遇到过像“...SSRS 不喜欢临时表...”这样的事情。上面链接中描述的问题让我觉得观察到的现象一定有其他的解释。
      • SP 中的临时表很好,但用于在 SSRS 中编写查询时就不行了
      • 再一次,这根本不正确。一定有其他因素在起作用。
      • 对不起,我不明白你的意思。您能否详细说明并说明为什么这是不正确的,以及如何让它为您工作?
      【解决方案4】:

      它通过在我的报告中使用JOIN(!Parameters!someparameter.Value, ",") 起作用。 报表称为SP,在SP内部,参数由Split table函数解析,然后加入列作为过滤器。

      【讨论】:

        【解决方案5】:

        为了清楚起见,我认为这个线程对临时表得出了错误的结论。

        我认为这里的问题(我遇到了同样的问题)是逗号之间的空格。当您输入一个没有空格且只有逗号的字符串时,它可以工作,但是当您在参数部分(例如,如果您复制粘贴)中输入一个字符串时,通常会在不同的行中隔开。将其拉回以逗号分隔的值时,SSRS 在每个值之间添加一个空格。然后它不起作用。我不确定幕后到底发生了什么,但我知道空间被破坏了,没有它们它可以工作。这解释了您提出的所有案例。您还使用参数中的连接找到了解决方案!对于我的情况以及可能最相似的情况,代码很简单 join(parameter, ", ")

        使用它可以粘贴带或不带空格的值,它应该可以工作!希望这能消除任何困惑!

        【讨论】:

          猜你喜欢
          • 2023-03-26
          • 2014-02-08
          • 2015-12-10
          • 2016-02-22
          相关资源
          最近更新 更多