通过嵌套的select case语句过滤存储过程记录

时间:2014-09-14 20:10:18

标签: tsql stored-procedures sql-server-2012 case-statement

我需要从this post进一步优化我的存储过程结果集,我需要过滤我的结果集以仅显示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'的记录?

2 个答案:

答案 0 :(得分:1)

尝试将存储的proc结果选择到临时表中,然后选择 *来自#TempTable

答案 1 :(得分:0)

我们可以使用模式定义来解决此问题。

似乎在您的一个案例陈述中发生了隐式转换,但如果没有架构定义,则很难找到哪一个。

您无法在CASE表达式中安全地混合数据类型,除非您完全确定任何隐式转换都能正常运行,确定您应该明确转换。

根据错误消息来判断是否包含可能是字符串(20111028)加上某种其他数据的时间?时间?(995999)它可能是要做的事情使用Invoice_DeliveryDate,但这是一个没有更多细节的黑暗镜头。