2016-12-13 7 views
3

私は、フォームの結果をXML列に格納するデータベースを持っています。残念ながら、最初に余分な文字が格納されているため、直接解析できないので、値を解析する前に削除する必要があります。私が持っているもう1つの制限は、私がレポート(Xtraction)を表示するのに使うシステムが、サブクエリを実行することしか許さないということです。SQLサブクエリのXMLドロップダウンから選択した値を返します

これらの制限にもかかわらず、XMLフィールドからテキスト値を取得する方法は成功しましたが、ドロップダウンから選択した値に適用できないようです。私のメソッドは、選択された値だけでなく、すべてのドロップダウンオプションも区切られていない文字列で返します。

の形が非常に大きいため、私は余分な文字や下のXMLのドロップダウン部分以外のすべてを削除した:

_RCFM*=.hÞ<form><select id="Dropdown01" label="Substantive APS Level:" 
mandatory="true" readonly="false" style="combo" type="string" 
visible="true">EL1<option label=""/><option 
label="APS5">APS5</option><option label="APS6">APS6</option><option 
label="EL1">EL1</option></select></form> 

私が使用していたサブクエリは次のとおりです。

(SELECT 
x.CARTITEMID 
, x.DROPDOWN01 
FROM (
SELECT 
    CARTITEMID 
    , CAST(RIGHT(cast(cast(SVCCARTITEMM1.OPTIONS as varbinary(max)) as varchar(max)), 
    LEN(cast(cast(SVCCARTITEMM1.OPTIONS as varbinary(max)) as varchar(max))) 
    -CHARINDEX('<form>',cast(cast(SVCCARTITEMM1.OPTIONS as varbinary(max)) as varchar(max)))+1) 
    AS XML).value('(/form/select[@id="Dropdown01"])[1]', 'varchar(max)')[DROPDOWN01] 

FROM SVCCARTITEMM1) x 
) 

上記のサブクエリの結果は次のとおりです。 EL1APS5APS6EL1

この場合、選択したテキストのみを返す必要があります。この場合、最初の 'EL1'は文字列。

CASTから 'AS XML'までのコードは、通常はフィールド参照の場所であり、これは前述の先頭の文字を変換して削除するために使用したものです。

お手伝いをしていますが、私は本当にこのやや不明瞭な問題の解決策を見つけようとしました。

+0

'SVCCARTITEMM1.OPTIONS'のデータ型は何ですか? – Shnugo

答えて

0

XQuery式にtext()ノードを指定します。

(/form/select[@id="Dropdown01"]/text())[1] 
1

ノードの値はすべてコンテンツです。これを試してください:

DECLARE @x XML= 
'<x>hallo1 
    <a>testa</a> 
    hallo2 
    <b>testb</b> 
    hallo3 
</x>'; 

SELECT x.value('.','nvarchar(max)') AS EntireContent 
     ,x.value('(./text())[1]','nvarchar(max)') AS FirstText 
     ,x.value('(./text())[2]','nvarchar(max)') AS SecondText 
     ,x.value('(./a)[1]','nvarchar(max)') AS DeeperNode --might use `text()` here as well 
FROM @x.nodes('/x') AS A(x); 

この列のデータ型は指定していません。 の先頭文字がであるため、XMLにはなりません。あなたのコードは私がそれがある種のテキストだと思うようにします。 (10年以上の非推奨が、別の選択はあなたのコードがポイントかもしれません)

DECLARE @YourTbl TABLE(OPTIONS NVARCHAR(MAX)); 
INSERT INTO @YourTbl VALUES 
(N'_RCFM*=.hÞ<form><select id="Dropdown01" label="Substantive APS Level:" 
mandatory="true" readonly="false" style="combo" type="string" 
visible="true">EL1<option label=""/><option 
label="APS5">APS5</option><option label="APS6">APS6</option><option 
label="EL1">EL1</option></select></form>'); 

SELECT Casted.value(N'(/form/select[@id="Dropdown01"]/text())[1]','nvarchar(max)') 
FROM @YourTbl AS t 
CROSS APPLY(SELECT CAST(SUBSTRING(t.OPTIONS,CHARINDEX('<',t.OPTIONS),10000) AS XML)) AS A(Casted) 

あなたの列のデータ型がIMAGEまたはTEXTた場合は、この試してください:私はあなたの全体のクエリを簡素化することができると思います

SELECT AsXML.value(N'(/form/select[@id="Dropdown01"]/text())[1]','nvarchar(max)') 
FROM @YourTbl AS t 
CROSS APPLY(SELECT CAST(CAST(t.OPTIONS AS VARBINARY(MAX)) AS VARCHAR(MAX))) AS A(AsString) 
CROSS APPLY(SELECT CAST(SUBSTRING(AsString,CHARINDEX('<',AsString),10000) AS XML)) AS B(AsXML) 

注意無効な文字のようなエラーがスローされた場合は、AS VARCHARの代わりに最初のCROSS APPLYNVARCHARを使用するようにしてください。

関連する問題