Для отчета SSRS с несколькими параметрами выбора, когда я «выбираю все» для параметра, имеющего длинный список значений, report выдает ошибку javascript

#ssrs-2008

#ssrs-2008

Вопрос:

Это ошибка, которую я получаю: «Ошибка: Sys.WebForms.Исключение PageRequestManagerServerErrorException: при обработке запроса на сервере произошла неизвестная ошибка. Код состояния, возвращенный с сервера, был: 500:». Я подозреваю, что это связано с тем, что длина URL превышает 2083 символа. Несмотря на то, что одним из решений этой проблемы было добавление тега below в файл web.config в папке reportserver и папке ReportManager, у меня это не сработало. Может кто-нибудь, пожалуйста, помогите?

тег —>

Комментарии:

1. Что, если вы выберете более 1 значения, а не все, вы все равно получите ошибку?

2. Спасибо за ваш ответ @pinwar13. Я получаю ошибку только тогда, когда количество выбранных значений превышает определенное число. В остальном отчет работает нормально. Когда я пытаюсь просмотреть отчет на вкладке предварительного просмотра visual studio для SSRS, я не вижу никакой ошибки.

Ответ №1:

Ошибка связана с тем, что в выпадающем меню слишком много значений, а URL-адрес, скорее всего, превышает максимальную длину, как вы отметили. Обходным путем для этого было бы создать в самом раскрывающемся списке опцию «Выбрать все» и позволить хранимой процедуре выполнить остальную работу.

Если вы используете запрос для заполнения доступных значений для параметра, вы можете выполнить ОБЪЕДИНЕНИЕ, чтобы включить опцию «Выбрать все».

Обратите внимание, что в этом решении вам потребуется определенная пользователем функция для разделения значений, поскольку SSRS отправляет несколько значений на SQL Server в формате, разделенном запятыми.

 CREATE FUNCTION dbo.udf_Split
(    
    @RowData NVARCHAR(MAX),
    @Delimeter NVARCHAR(MAX)
)
RETURNS @RtnValue TABLE 
(
    ID INT IDENTITY(1,1),
    Data NVARCHAR(MAX)
) 
AS
BEGIN 
    DECLARE @Iterator INT
    SET @Iterator = 1

    DECLARE @FoundIndex INT
    SET @FoundIndex = CHARINDEX(@Delimeter,@RowData)

    WHILE (@FoundIndex>0)
    BEGIN
        INSERT INTO @RtnValue (data)
        SELECT 
            Data = LTRIM(RTRIM(SUBSTRING(@RowData, 1, @FoundIndex - 1)))

        SET @RowData = SUBSTRING(@RowData,
                @FoundIndex   DATALENGTH(@Delimeter) / 2,
                LEN(@RowData))

        SET @Iterator = @Iterator   1
        SET @FoundIndex = CHARINDEX(@Delimeter, @RowData)
    END

    INSERT INTO @RtnValue (Data)
    SELECT Data = LTRIM(RTRIM(@RowData))

    RETURN
END
GO
 

Ваш запрос для заполнения доступных значений для параметра будет выглядеть примерно так:

 SELECT 'Select All' AS "FilterValues"

UNION

SELECT FilterValues
FROM tbl_AvailableValues
 

Ваша процедура получения ваших данных будет выглядеть примерно так:

 CREATE PROCEDURE usp_GetData @FilterValues NVARCHAR(MAX)

AS

BEGIN

    IF @FilterValues = 'Select All'
    SELECT *
    FROM tbl_Data;

ELSE 

    SELECT *
    FROM tbl_Data
    WHERE tbl_Data.FilterColumn IN (SELECT DATA FROM udf_Split(@FilterValues,','));

END

GO
 

Надеюсь, это поможет

Комментарии:

1. Большое вам спасибо Louie…It сработало! .. но теперь я вижу несколько вариантов «Выбрать все» в моем выпадающем списке ….. в остальном все работает отлично. Еще раз спасибо 🙂