Относительно случая, когда в хранимой процедуре

StackOverflow https://stackoverflow.com/questions/1859280

Вопрос

У меня есть следующий запрос.

 declare @Prm_CourseId int
declare @Prm_SpecializationId int
set @Prm_CourseId=5
set @Prm_SpecializationId=0
declare @WhrStr varchar(500)


set @WhrStr =  case @Prm_CourseId
                when 0 then
                    'e.CourseId is null or e.CourseId is not  null'
                when -1 then
                    'e.CourseId is null or e.CourseId is not  null'
                when isnull(@Prm_CourseId,0)  then
                     'e.CourseId is null or e.CourseId is not  null'
                else
                     'e.CourseId= '+Convert(varchar,@Prm_CourseId)

                 end
set @WhrStr  = case @Prm_SpecializationId
                when 0 then
                    'e.SpecializationId is null or e.SpecializationId is not  null'
                when -1 then
                    'e.SpecializationId is null or e.SpecializationId is not  null'
                when isnull(@Prm_SpecializationId,0)  then
                     'e.SpecializationId is null or e.SpecializationId is not  null'
                else
                     'e.SpecializationId= '+Convert(varchar,@ Prm_SpecializationId)
                end
print @WhrStr
    exec(
            'select f.EnquiryID,
            e.[Name],
            f.AttendedBy,
            f.Remarks,
            f.CreatedDate
            from STD_FollowUp f
                inner join
                    STD_Enquiry e
                     on f.EnquiryId=e.EnquiryId
            where'+' '+@WhrStr
    )

здесь проблема в том, что я хочу получить результат в 1-м и 2-м операторах case в @WhrStr . Но значение, входящее в WhrStr, равно 'e.SpecializationId равно нулю или e.SpecializationId не равен нулю', означает, что 1-й заменяется вторым.Есть ли в любом случае возможность добавить второе к первому.

Это было полезно?

Решение

if (isnull(@Prm_CourseId, 0) = 0 or isnull(@Prm_CourseID, 0) = -1)
    set @Prm_CourseId = null

if (isnull(@Prm_SpecializationId, 0) = 0 or isnull(@Prm_SpecializationId, 0) = -1)
    set @Prm_SpecializationId = null

select f.EnquiryID,
e.[Name],
f.AttendedBy,
f.Remarks,
f.CreatedDate
from STD_FollowUp f
inner join
STD_Enquiry e
on f.EnquiryId=e.EnquiryId
where (@Prm_CourseId is null or e.CourseId = @Prm_CourseId)
or (@Prm_SpecializationId is null or e.SpecializationId = @Prm_SpecializationId)

Другие советы

Это не будет работать на нескольких уровнях.

  • Вы не можете добавить строку к запросу.Это либо полностью динамично, либо не полностью.
  • Случай, КОГДА бит должен быть в строковых разделителях "...THEN '(e.CourseId is null or e.CourseId is not null)'...

  • "e.CourseID равен нулю или e.CourseID не равен нулю" - это одно и то же "всегда предоставляйте мне данные".

Все, что вам нужно, это:

select f.EnquiryID,
    e.[Name],
    f.AttendedBy,
    f.Remarks,
    f.CreatedDate
from STD_FollowUp f
            inner join
                    STD_Enquiry e
                    on f.EnquiryId=e.EnquiryId
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top