Хранимая процедура с необязательными параметрами, не показывающими нулевые значения для объединенной таблицы - PullRequest
0 голосов
/ 08 марта 2012

Я посмотрел вокруг и нашел разные подходы к этой проблеме, но ни один из них не работал в моей конкретной ситуации.Я написал хранимую процедуру, которую я использую для отчета SSRS, который учитывает необязательные параметры (в SSRS я указываю список доступных параметров вместе с опцией «All», где значение установлено в «= Nothing»).).Это работает для размещения нескольких необязательных параметров, когда, если ничего не выбрано, отображаются все записи ... кроме тех, которые имеют нулевые значения ProjectID.

Я хотел бы иметь возможность запускать хранимую процедуру и указывать «Null» для параметра @Project и отображать эти значения с пустыми полями ProjectID, а в идеале добавить параметр «None» в мои SSRS.отчет по этому параметру, который также показывает эти значения.

Я не совсем уверен, как изменить SP для достижения этой цели:

ALTER PROCEDURE [dbo].[TasksByStatus]

@Status AS Integer = NULL,
@Project AS Integer = NULL

AS

BEGIN

SELECT Task, CONVERT(VARCHAR, StartDate, 101) AS StartDate, 
      (CASE WHEN CompleteDate IS NULL THEN 'Not complete yet' 
       ELSE CONVERT(VARCHAR, CompleteDate, 101) END) AS CompleteDate, 
      (CASE WHEN Notes IS NULL THEN 'No notes provided' ELSE Notes END) AS Notes, 
       ProjectName, StatusName
FROM Tasks 
INNER JOIN Status ON Tasks.StatusID = Status.ID
LEFT JOIN Projects ON Tasks.ProjectID = Projects.ID 
AND Projects.ID IS NULL

WHERE Status.ID = ISNULL(@Status, Status.ID) 
AND Projects.ID = ISNULL(@Project, Projects.ID)
ORDER BY StartDate, StatusName

END

Результаты запроса без указания параметров:

Results of query without specifying parameters

Я намерен при указании NULL для @Project видеть только одну запись со значением NULL ProjectID.

Изменить, чтобы уточнить

Для OP, пожалуйстамы знаем, какими должны быть точные результаты для каждой строки в данной таблице.Кроме того, когда вы упоминаете «None», как бы вы хотели передать это хранимой процедуре? (переменная @Project определяется как целое число)

Parameter  Projects.ID  In Result
-----------------------------------------
1          1            Yes  
1          2            No  
1          NULL         No
'None'     1            No
'None'     2            No 
'None'     NULL         Yes
NULL       1            Yes
NULL       2            Yes
NULL       NULL         Yes

Ответы [ 2 ]

0 голосов
/ 08 марта 2012

Этот тип запроса является ярлыком для катастрофы. Помните, что SQL должен скомпилировать план запроса, который работает для любого значения параметров. Поэтому будет в значительной степени принудительно выполнять сканирование таблиц как для Status, так и Projects таблиц , даже если были указаны @Project и / или @Status ! Эрланд Соммарског подробно описывает эту тему на Условия динамического поиска в T-SQL

Разделите это на 3 разных запроса:

if (@Status is null and @Project is null)
   select ...;
else if (@status is null)
   select ... where ProjectID = @Project;
else if (@project is null)
   select ... where StatusID = @status;
else
   select ... where StatusID = @status and ProjectID = @Project;
0 голосов
/ 08 марта 2012

Если вы хотите LEFT JOIN на Products, то вам нужно включить это предложение в ON, а не WHERE. Помещение в WHERE делает его INNER JOIN.

ALTER PROCEDURE [dbo].[TasksByStatus]
  @Status  INT = NULL,
  @Project INT = NULL
AS
BEGIN
  SET NOCOUNT ON;

  SELECT 
    Task, 
    CONVERT(VARCHAR, StartDate, 101) AS StartDate, 
    (CASE WHEN CompleteDate IS NULL THEN 'Not complete yet' 
     ELSE CONVERT(VARCHAR, CompleteDate, 101) END) AS CompleteDate, 
    (CASE WHEN Notes IS NULL THEN 'No notes provided' ELSE Notes END) AS Notes, 
    ProjectName, StatusName
  FROM dbo.Tasks 
  INNER JOIN dbo.Status ON Tasks.StatusID = Status.ID
  LEFT JOIN dbo.Projects ON Tasks.ProjectID = Projects.ID 
  WHERE Status.ID = COALESCE(@Status, Status.ID) 
    AND COALESCE(Projects.ID, -1) = COALESCE(@Project, Projects.ID, -1)
  ORDER BY StartDate, StatusName;
END
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...