2017-08-30 3 views
1

ブール値をシミュレートするビットタイプのフィールドがありますが、フィールドを文字列フィールドに連結しようとしています。STUFF FOR XML PATHを使用してもエラーが発生します。ここでクエリがあります:XMLパスのためのもの

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については叫んでいます。 だから私はこのような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

そして、それがためにどこかにカンマを私に悲鳴?わからない。

メッセージレベル24、レベル16、状態1、行1 のvarchar値 '、'をデータ型intに変換すると変換に失敗しました。

構文の問題はどこですか?またはこれはより多くのデータ型の問題ですか?

+2

すべてを解き放つことなく、SQL Server 2012以降を使用している場合は、 'CONCAT( '、'、column)'の使用を検討してください。デフォルトのコンバージョンに絡みつくことなく、常に文字列に変換されます。スタッフの代わりに –

+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キーワードは、POSフィールドに値を詰め込むの目的であった、PositionInfoテーブル内の各エントリの列を有するから維持するために使用しました。

この質問に貢献した皆様に感謝します。

関連する問題