Фильтрация записей хранимых процедур по вложенному оператору select case

Мне нужно дополнительно уточнить мой сохраненный набор результатов proc из этот пост, мне нужно отфильтровать мой набор результатов, чтобы отображать только те записи, где emailaddr NULL (что означает отображение только тех записей, которые имеют Invoice_DeliveryType значение 'N' ).

Среди многочисленных запросов я пробовал:

select 
    Invoice_ID, 'Unknown' as Invoice_Status, 
    case when Invoice_Printed is null then '' else 'Y' end as Invoice_Printed, 
    case when Invoice_DeliveryDate is null then '' else 'Y' end as Invoice_Delivered, 
    (case when Invoice_DeliveryType <> 'USPS' then ''
          when exists (Select 1
                   from dbo.Client c
                   Where c.Client_ID = SUBSTRING(i.Invoice_ID, 1, 6) and
                         c.emailaddr is not null
                  )
          then 'Y'
          else 'N'
     end)
    Invoice_ContactLName + ', ' + Invoice_ContactFName as ContactName, 
from 
    dbo.Invoice
left outer join 
    dbo.fnInvoiceCurrentStatus() on Invoice_ID = CUST_InvoiceID 
where 
    CUST_StatusID = 7 
    AND Invoice_ID = dbo.Client.Client_ID
    AND dbo.client.emailaddr is NULL
order by 
    Inv_Created  

но я получаю сообщение об ошибке

Преобразование значения nvarchar '20111028995999' привело к переполнению столбца int

Как я могу заставить хранимую процедуру возвращать только записи с DeliveryType = 'N' ?


person user3929962    schedule 14.09.2014    source источник
comment
Взгляните на эту страницу: sqlcuriosities.weebly.com/1/post/2011/11/   -  person Troy    schedule 15.09.2014
comment
Предикаты Invoice_ID = dbo.Client.Client_ID и dbo.client.emailaddr is NULL не имеют никакого смысла: в вашем запросе на этом уровне нет dbo.Client.   -  person Andriy M    schedule 15.09.2014
comment
Кроме того, не очень помогает лучше понять проблему то, что некоторые столбцы в вашем запросе не квалифицированы ссылками на таблицы.   -  person Andriy M    schedule 15.09.2014


Ответы (2)


Попытка выбрать сохраненные результаты процесса во временную таблицу, затем выберите * из #TempTable

person MJH    schedule 15.09.2014
comment
Я попытался использовать шаблон (sommarskog.se/share_data.html#INSERTEXEC), но не получить сообщение об ошибке Оператор INSERT EXEC не может быть вложенным. - person user3929962; 15.09.2014

Нам действительно не помешало бы определение схемы, чтобы решить эту проблему.

Похоже, что в одном из ваших операторов case происходит неявное преобразование, но без определения схемы трудно отследить, какое именно.

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

Судя по сообщению об ошибке, которое может быть датой, представленной в виде строки (20111028), плюс какие-то другие данные «время» (995999), это может быть как-то связано с Invoice_DeliveryDate, но это выстрел в темноте без подробностей.

person Mack    schedule 15.09.2014
comment
эта ошибка также возникала в предыдущем посте, но в этой ситуации, когда я добавил, что c.emailaddr не равен нулю, запрос работал отлично. - person user3929962; 15.09.2014