sql错误:转换nvarchar时转换失败

时间:2011-11-30 05:33:53

标签: sql sql-server-2008

我正在尝试运行此查询但无效。我收到了一个错误。如何解决?:

将nvarchar值'Jon Yang'转换为数据类型int时转换失败。

SQL

use adventureworks 
go 

select si.CustomerID, 
'myField' = 
            CASE 
                 When (Select Top 1 FirstName+ ' ' + LastName + ' ' + EmailPromotion   From Person.Contact pc Where si.ContactID = pc.contactid ) is not null Then  
            Cast((Select Top 1 FirstName+ ' ' + LastName  + ' ' + EmailPromotion From Person.Contact pc Where si.ContactID = pc.contactid  ) As varchar) 
            Else '' 
            END 
from Sales.Individual si 
where si.CustomerID=11000 

2 个答案:

答案 0 :(得分:2)

由于datatype precedence而发生错误:nvarchar将转换为int。

它位于EmailPromotionCustomerID,因此请确定下面您想要的哪一行。 此外,无需使用内联查询。

select
    si.CustomerID, 
    'myField' = ISNULL(FirstName + ' ' + 
                       LastName  + ' ' + 
                       Cast(EmailPromotion AS nvarchar(100))
                       -- EmailPromotion ?
                       , '')
from
    Sales.Individual si 
    LEFT JOIN
    Person.Contact pc ON si.ContactID = pc.contactid
where
    si.CustomerID = N'11000'
    -- si.CustomerID = 11000 ?

没有ORDER BY的TOP是没有意义的,所以如果Person.Contact中的每一行Sales.Individual都有多行,则需要另一个构造......

答案 1 :(得分:0)

您要添加的其中一个字段必须是int类型 - 它可能是“EmailPromotion”字段吗?在任何情况下 - 添加意味着转换,但显然您不能为数字添加名称。相反,试试这个:

use adventureworks 
go 

select si.CustomerID, 
'myField' = 
            CASE 
                 When (Select Top 1 FirstName+ ' ' + LastName + ' ' + cast(EmailPromotion   as nvarchar) From Person.Contact pc Where si.ContactID = pc.contactid ) is not null Then  
            Cast((Select Top 1 FirstName+ ' ' + LastName  + ' ' + cast(EmailPromotion   as nvarchar)  From Person.Contact pc Where si.ContactID = pc.contactid  ) As varchar) 
            Else '' 
            END 
from Sales.Individual si 
where si.CustomerID=11000