Как добавить соединение на основе параметра, переданного в хранимой процедуре

#tsql #sql-server-2000

#tsql #sql-server-2000

Вопрос:

Могу ли я добавить внутреннее соединение или левое соединение или правое соединение на основе значения параметра. Единственный способ, который у меня сейчас есть, — это написать динамический запрос, например

 set @sql = 'select * from dbo.products PM(nolock)
'  case when @orgunit is not null then ' join productorgunit pou on PM.ProductNumber =     pou.ProductNumber '
               else ''
          end
           '
Exec(@sql).
  

Я надеюсь, что есть что-то вроде

 Select * from dbo.products PM(nolock)
case when @orgunit is not null then join productorgunit pou on PM.ProductNumber = pou.ProductNumber 

          end  
  

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

1. Почему не просто 3 отдельных запроса или оператор IF?

Ответ №1:

Разве вы не можете просто использовать ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ?

 SELECT PM.*, pou.ProductNumber 
FROM dbo.Products PM LEFT OUTER JOIN ProductOrgUnit pou ON 
                                     PM.ProductNumber = pou.ProductNumber
  

Это вернет все записи из Products и вернет данные из ProductOrgUnit только в том случае, если есть соответствующая запись (в противном случае поля pou будут иметь значение null в результирующем наборе).

В качестве альтернативы у вас может быть два отдельных запроса в вашем sproc и использовать оператор IF T-SQL, чтобы выбрать, какой из них запускать.