2017-02-07 3 views
1

Моя процедура такая, очень простая.Зачем передавать несколько значений целочисленного значения в SSRS, выдает ошибку преобразования?

ALTER PROCEDURE dbo.MyProcedure 
    @NoteStoreType INT 
AS 
    SELECT 
     Column1, Column2, Column3 
    FROM 
     tblNoteStore 
    WHERE 
     tblNoteStore.Type IN (COALESCE(@NoteStoreType, tblNoteStore.Type)) 

Мой набор данных для заполнения доступных значений параметров:

SELECT DISTINCT 
    tblNoteStore.Type, 
    lstNoteTypes.Description 
FROM 
    tblNoteStore 
INNER JOIN 
    lstNoteTypes ON tblNoteStore.Type = lstNoteTypes.NoteTypeID 
ORDER BY  
    lstNoteTypes.Description 

возвращает этот результат:

enter image description here

Тогда я иду к Отчету Свойства параметра Разрешить несколько значений:

enter image description here

Теперь настройки Доступные значения:

enter image description here

Тогда, если я запускаю отчет с более чем одно значение, оно дает мне ошибку:

enter image description here

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

Но какова будет работа в этой ситуации?

+0

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

ответ

1

Я стараюсь избегать динамического SQL, как это труднее поддерживать. Вы можете применить этот параметр в качестве фильтра в SQL или вы можете применить его на уровне набора данных после запуска запроса.

Добавление фильтра набора данных довольно просто. Единственный недостаток - то, что он менее эффективен. Если разница в скорости незначительна, это хороший вариант. enter image description here

В некоторых версиях SSRS вы можете использовать регулярное IN заявление в SQL:

WHERE tblNoteStore.Type IN (@NoteStoreType) 

Если это не работает с версией, вы можете также использовать пользовательскую функцию Split в вашем SQL чтобы разбить строку, разделенную запятой, на отдельные значения. Уже есть много ответов, посвященных этой конкретной теме.

1

Параметр @NoteStoreType INT в хранимой процедуре - это один INTEGER, а не список целых значений. Вы должны попробовать с динамическим запросом:

CREATE PROCEDURE dbo.MyProcedure 
@NoteStoreType NVARCHAR(2048) 
AS 
BEGIN 

    DECLARE @cmd NVARCHAR(MAX) 

    SET @cmd = 'SELECT Column1, Column2, Column3 
       FROM tblNoteStore 
       WHERE tblNoteStore.Type IN (' + @NoteStoreType + ')'; 

    EXEC (@cmd); 

END 
GO 

Проверьте это здесь: http://rextester.com/NWLLU92997

+0

Спасибо. Отличная идея, но моя процедура намного больше той, которую я публикую. Он также имеет 6 различных параметров. – Oleg

+0

Просто процитируйте его и позаботьтесь о своих параметрах. – McNets

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