TSQL XML - 在Cross Apply上过滤节点LIKE'x'

Tat*_*ice 3 xml t-sql sql-server nodes

使用以下XML:

<Path>
    <To>
        <Value>
            <Array>
                <NumberDecimal>10.0</NumberDecimal>
                <TextEnglish>Ten</TextEnglish>
                <NumberRomanNumeral>X</NumberRomanNumeral>
            </Array>
        </Value>
    </To>
</Path>
Run Code Online (Sandbox Code Playgroud)

如何过滤以下交叉应用于所有/仅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)
Run Code Online (Sandbox Code Playgroud)

收益:

NumberDecimal: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)
Run Code Online (Sandbox Code Playgroud)

需要退货:

NumberDecimal:10

NumberRomanNumeral:X

但它什么也没有回报....

Mar*_*ith 5

您可以使用[contains(local-name(.),'Number')]' demo 查找名称中包含字符串的元素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)
Run Code Online (Sandbox Code Playgroud)

或者[substring(local-name(.),1,6) eq "Number"]找到字符串在某个位置的元素(在本例中为开头)

对于任何更具异国情调的东西,你最好在TSQL中做到这一点

WHERE child.value('local-name(.)', 'sysname')  LIKE '[SomeExpression]'
Run Code Online (Sandbox Code Playgroud)

  • @TaterJuice - 是的SQL Server只实现了一些XQuery函数https://docs.microsoft.com/en-us/sql/xquery/xquery-functions-against-the-xml-data-type (3认同)
  • 但是substring是其中之一,所以如果您的目标是在字符串中搜索确切指定的偏移量,那么这是可行的. (2认同)