2011-11-30 137 views
0

我想运行这个查询,但不工作。我收到一个错误。如何解决?:sql错误:转换nvarchar转换失败

将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

由于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 ? 

TOP时没有ORDER BY是没有意义的,所以如果你在Sales.Individual有多个排在Person.Contact每一行你需要另一种构建...

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