我正在尝试运行此查询但无效。我收到了一个错误。如何解决?:
将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
答案 0 :(得分:2)
由于datatype precedence而发生错误:nvarchar将转换为int。
它位于EmailPromotion
或CustomerID
,因此请确定下面您想要的哪一行。
此外,无需使用内联查询。
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