2017-08-30 66 views
1

我有一个字段是模拟布尔值的位类型,但我试图使用STUFF FOR XML PATH连接字段到一个字符串字段,它不断给我一个错误。这里的查询:XML路径的东西不能连接BIT类型

select 
    ui.IndivId, 
    ui.correctedInFNV, 
    ni.firstName, 
    ni.prefName, 
    ni.lastName, 
    ni.suffix, 
    ni.alreadyCorrect as nameCorrect, 
    ni.updated as nameUpdated, 
    ni.updatedDate, 
    ni.correctPerson, 
    ai.addr1, 
    ai.addr2, 
    ai.addr3, 
    ai.city, 
    ai.state, 
    ai.zip, 
    ai.country, 
    ai.alreadycorrect as adcorrect, 
    ai.updatedDate, 
    ai.updated as adupdated, 
    pi.priPhoneType, 
    pi.priPhoneNumber, 
    pi.updated as phoneupdated, 
    pi.updateddate, 
    ei.priEmailType, 
    ei.priEmailAddress, 
    ei.alreadycorrect as emailcorrect, 
    ei.updated as emailupdated, 
    STUFF((SELECT ','+pos.positionTitle from positionInfo as pos where pos.IndivId=ui.IndivId FOR XML PATH('')),1,1,'') AS POS_TITLE, 
    STUFF((SELECT ','+pos.positionId from positionInfo as pos where pos.IndivId=ui.IndivId for XML PATH('')),1,1,'') as POS_ID, 
    STUFF((SELECT ','+pos.positionCode from positionInfo as pos where pos.IndivId=ui.IndivId for XML PATH('')),1,1,'') as POS_CODE, 
    STUFF((SELECT ','+pos.areaServed from positionInfo as pos where pos.IndivId=ui.IndivId for XML PATH('')),1,1,'') as POS_AREA, 
    STUFF((SELECT ','+pos.districtServed from positionInfo as pos where pos.IndivId=ui.IndivId for XML PATH('')),1,1,'') as POS_DIST, 
    STUFF((SELECT ','+pos.reason from positionInfo as pos where pos.IndivId=ui.IndivId for XML PATH('')),1,1,'') as POS_REASON, 
    STUFF((SELECT ','+pos.currentlyHeld from positionInfo as pos where pos.IndivId=ui.IndivId FOR XML PATH('')),1,1,'') AS POS_HELD 
from 
    updatedInfo as ui 
    join nameInfo as ni on ui.IndivId=ni.nameInfoId 
    join addressInfo as ai on ui.IndivId=ai.addressInfoId 
    join phoneInfo as pi on ui.IndivId=pi.phoneInfoId 
    join emailInfo as ei on ui.IndivId=ei.emailInfoId 
    JOIN positionInfo AS pos ON ui.IndivId=pos.IndivId 

当这样跑,我得到的错误

消息402,级别16,状态1,36线的数据类型为varchar和位是 在增加操作符不兼容。

这是最后STUFF声明pos.currentlyHeld尖叫。 所以我尝试转换或铸造领域为char类型是这样的:

STUFF((SELECT ','+CAST(pos.currentlyHeld AS VARCHAR(1)) FROM positionInfo as pos where pos.IndivId=ui.IndivId FOR XML PATH('')),1,1,'') AS POS_HELD

然后尖叫着我,因为一个逗号的地方吗?不确定。

Msg 245,Level 16,State 1,Line 1将 varchar值','转换为数据类型int时,转换失败。

如果是语法问题?或者这是更多的数据类型问题?

+2

没有试图解开一切 - 如果你的SQL Server 2012或更高版本,可以考虑使用'CONCAT( '',列)'。它将始终转换为字符串,而不会被默认转换混乱。 –

+0

而不是东西? –

+1

不是'','+ column'('','+ 1')是无效的,因为SQL Server最好将字符串转换为整数,而不是其他方式,比如合理的系统。 –

回答

1

考虑到这个问题是一个SQL Server 2008中的实现,在CONCAT()功能不可用。

如所暗示的,查询应该在STUFF的每个语句中将所有字段转换为NVARCHAR(MAX)

最后的查询如下:

select distinct 
    ui.IndivId, 
    ui.correctedInFNV, 
    ni.firstName, 
    ni.prefName, 
    ni.lastName, 
    ni.suffix, 
    ni.alreadyCorrect as nameCorrect, 
    ni.updated as nameUpdated, 
    ni.updatedDate, 
    ni.correctPerson, 
    ai.addr1, 
    ai.addr2, 
    ai.addr3, 
    ai.city, 
    ai.state, 
    ai.zip, 
    ai.country, 
    ai.alreadycorrect as adcorrect, 
    ai.updatedDate, 
    ai.updated as adupdated, 
    pi.priPhoneType, 
    pi.priPhoneNumber, 
    pi.updated as phoneupdated, 
    pi.updateddate, 
    ei.priEmailType, 
    ei.priEmailAddress, 
    ei.alreadycorrect as emailcorrect, 
    ei.updated as emailupdated, 
    STUFF((SELECT ','+CONVERT(NVARCHAR(MAX),pos.positionTitle) from positionInfo as pos where pos.IndivId=ui.IndivId FOR XML PATH('')),1,1,'') AS POS_TITLE, 
    STUFF((SELECT ','+CONVERT(NVARCHAR(MAX),pos.positionId) from positionInfo as pos where pos.IndivId=ui.IndivId for XML PATH('')),1,1,'') as POS_ID, 
    STUFF((SELECT ','+CONVERT(NVARCHAR(MAX),pos.positionCode) from positionInfo as pos where pos.IndivId=ui.IndivId for XML PATH('')),1,1,'') as POS_CODE, 
    STUFF((SELECT ','+CONVERT(NVARCHAR(MAX),pos.areaServed) from positionInfo as pos where pos.IndivId=ui.IndivId for XML PATH('')),1,1,'') as POS_AREA, 
    STUFF((SELECT ','+CONVERT(NVARCHAR(MAX),pos.districtServed) from positionInfo as pos where pos.IndivId=ui.IndivId for XML PATH('')),1,1,'') as POS_DIST, 
    STUFF((SELECT ','+CONVERT(NVARCHAR(MAX),pos.reason) from positionInfo as pos where pos.IndivId=ui.IndivId for XML PATH('')),1,1,'') as POS_REASON, 
    STUFF((SELECT ',' + CONVERT(NVARCHAR(MAX), pos.currentlyHeld) from positionInfo as pos where pos.IndivId=ui.IndivId FOR XML PATH('')),1,1,'') AS POS_HELD 
from 
    updatedInfo as ui 
    join nameInfo as ni on ui.IndivId=ni.nameInfoId 
    join addressInfo as ai on ui.IndivId=ai.addressInfoId 
    join phoneInfo as pi on ui.IndivId=pi.phoneInfoId 
    join emailInfo as ei on ui.IndivId=ei.emailInfoId 
    JOIN positionInfo AS pos ON ui.IndivId=pos.IndivId 

DISTINCT关键字被用于从具有用于在PositionInfo表中的每个条目,这是馅值到POS字段的目的,行保持。

非常感谢大家谁对这个问题作出了贡献。