#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, чтобы выбрать, какой из них запускать.