2016-12-13 23 views
3

我有一個數據庫,它將表單的結果存儲在XML列中。不幸的是,它在開始時還存儲了一些額外的字符,不能直接解析,所以我需要在解析值之前將其刪除。另一個限制是我用來顯示報告的系統(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。你的代碼讓我覺得它是某種文本。我覺得你的整個查詢可以簡化爲:

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(不建議使用超過10年,但另一種選擇你的代碼可能指向),試試這個:

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的地方使用NVARCHAR第一CROSS APPLY

相關問題