2017-08-30 75 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字段的目的,行保持。

非常感謝大家誰對這個問題作出了貢獻。