TSQL XML - 在交叉应用时过滤节点,如'x'



with以下xml:

<Path>
    <To>
        <Value>
            <Array>
                <NumberDecimal>10.0</NumberDecimal>
                <TextEnglish>Ten</TextEnglish>
                <NumberRomanNumeral>X</NumberRomanNumeral>
            </Array>
        </Value>
    </To>
</Path>

如何过滤以下十字应用程序应用于所有/仅Number*** XML节点?

SELECT child.value('concat(local-name(.),": ",.)', 'varchar(max)') AS [value]
FROM imports i
CROSS APPLY i.import_data.nodes('/Path/To/Value/Array/*[local-name(.) = ''NumberDecimal'']') AS nodes(child)

返回:

数字:10

需要这样:

SELECT child.value('concat(local-name(.),": ",.)', 'varchar(max)') AS [value]
FROM imports i
CROSS APPLY i.import_data.nodes('/Path/To/Value/Array/*[local-name(.) = ''Number/*'']') AS nodes(child)

需要返回:

数字:10

numberMannumeral:x

但是它没有返回....

您可以使用 [contains(local-name(.),'Number')]'演示来查找名称包含字符串 Number

的元素
Declare @x xml = '<Path>
    <To>
        <Value>
            <Array>
                <NumberDecimal>10.0</NumberDecimal>
                <TextEnglish>Ten</TextEnglish>
                <NumberRomanNumeral>X</NumberRomanNumeral>
            </Array>
        </Value>
    </To>
</Path>'

SELECT child.value('concat(local-name(.),": ",.)', 'varchar(max)') AS [value]
FROM (SELECT @x as import_data)  i
CROSS APPLY i.import_data.nodes('/Path/To/Value/Array/*[contains(local-name(.),''Number'')]') AS nodes(child)

[substring(local-name(.),1,6) eq "Number"]要查找字符串在某个位置的元素(在这种情况下为start)

对于更异国情调的任何事情,您最好在TSQL

中做到这一点
WHERE child.value('local-name(.)', 'sysname')  LIKE '[SomeExpression]'

最新更新