2011-11-30 136 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