XML路径的东西不能连接BIT类型

时间:2017-08-30 13:03:30

标签: sql-server sql-server-2008

我有一个模拟布尔值的字段,但是我试图使用STUFF FOR XML PATH将字段连接到字符串字段,并且它一直给我一个错误。这是查询:

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和bit是   在add运算符中不兼容。

它对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。

语法问题在哪里?或者这是更多的数据类型问题吗?

1 个答案:

答案 0 :(得分:1)

考虑到这个问题是针对SQL Server 2008实现的,CONCAT()函数不可用。

根据建议,查询应该在NVARCHAR(MAX)个语句中将所有字段转换为STUFF

最终查询如下:

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字段的目的。

非常感谢为这个问题做出贡献的每个人。