Параметры SSRS.Разрешение «Все» или «Нуль» - PullRequest
3 голосов
/ 27 июля 2010

Параметры SSRS - это боль.Я хочу иметь возможность повторно использовать отчеты для самых разных нужд, предоставляя пользователям доступ ко многим различным параметрам и делая их необязательными.

Итак, если я начну с кода, такого как:

Select * from mytable myt
where myt.date between '1/1/2010' and '12/31/2010'
and year(myt.date) = '2010'
and myt.partnumber = 'XYZ-123' 

, я хочу, чтобы эти параметры были необязательными, поэтому мои первые попытки были сделать параметры по умолчанию пустыми, например:

and (myt.partnumber = (@PartNumber) or (@PartNumber) is null)

Это имеет проблемы, потому что, если рассматриваемые поля базы данных обнуляются, вы будете отбрасывать записи, потому что нуль не равен нулю.

Затем я использовал такой код:

DECLARE @BeginDate AS DATETIME
DECLARE @EndDate AS DATETIME
DECLARE @PartNumber AS VARCHAR(25)
SET @Year = '..All'
SET @BeginDate = '1/1/2005'
SET @EndDate = '12/31/2010'
SET @PartNumber = '..All'
SET @Year = '..All'

Select * from mytable myt
where (myt.date between (@BeginDate) and (@EndDate))
and (year(myt.date) =  (@Year) or (@Year) = '..All' )
and (myt.partnumber = (@PartNumber) or (@PartNumber) = '..All')

Это не работает, потому что Year (myt.date) является целым числом, а @Year - нет.

Итак, вот мои вопросы.

  1. Как я могу сделать мои даты необязательными?Является ли лучший способ просто по умолчанию их датами за пределами практического диапазона, поэтому я возвращаю все значения?
  2. Каков наилучший способ обработки пустых опций или опций «..Все», чтобы сделать мои запросы как можно более читабельными и позволить моим пользователям иметь необязательные параметры для большинства типов данных?Я бы предпочел не использовать нуль для

Ответы [ 3 ]

3 голосов
/ 28 июля 2010

Продолжите и разрешите пустые значения, что означает, что фильтр не должен применяться. Затем вы можете использовать следующее:

SELECT *
FROM mytable myt
WHERE COALESCE(myt.date, '1/1/1900') between COALESCE(@BeginDate, myt.date, '1/1/1900') and COALESCE(@EndDate, myt.date, '1/1/1900')
    AND COALESCE(YEAR(myt.date), -1) = COALESCE(@Year, YEAR(myt.date), -1)
    AND COALESCE(myt.partnumber, -1) = COALESCE(@PartNumber, myt.partnumber, -1)

В итоге, если какое-либо значение переменной равно NULL, сравните значение столбца с самим собой, что фактически игнорирует условие. Более конкретно, при тестировании myt.date, если @BeginDate равно NULL, установите нижнее значение диапазона равным значению myt.date. Сделайте ту же замену со значением @EndDate. Даже если @BeginDate и @EndDate равны NULL, условие будет истинным.

Аналогичный подход используется для YEAR(myt.date) и myt.partnumber. Если значение переменной равно NULL, сравните значение столбца с самим собой, что всегда равно true.

UPDATE: Добавлено значение по умолчанию для каждого COALESCE для обработки ситуации, когда значение столбца равно NULL.

1 голос
/ 28 июля 2010

Мне нравится ваш третий кодовый блок. Похоже, что ваше предложение WHERE может быть исправлено для работы со значением не-int. Предложение AND для годовой строки выглядело бы следующим образом - не лучший мой T-SQL, но оно должно указывать вам правильное направление:

and 1 = CASE @Year WHEN '..All' THEN 1 ELSE CASE WHEN year ( myt.date )  = CONVERT ( int, @Year ) THEN 1 ELSE 0 END END

Это позволит вам иметь строковое значение '..All' или значение int. Либо будет соответствовать правильно. Вы можете сделать то же самое с partnumber.

0 голосов
/ 31 июля 2010

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

Select * from mytable myt
where (myt.date between (@BeginDate) and (@EndDate))
and (@Year IS NULL OR COALESCE(myt.date,'1900') = @Year)
and (@PartNumber IS NULL OR ISNULL(myt.partnumber, '<NULL>') = (@PartNumber)  
...