SQL 服务器 xml select 部分匹配的值

SQL Server xml select values with partial match

我的问题是关于 select 从 xml 列中获取值,其中第一部分与另一列匹配。

即我有这个 xml:-

<PREFS>
    <HIERARCHY>
        <VALUE>[Hierarchy].[Country Name].&amp;[IRELAND]</VALUE>
        <VALUE>[Hierarchy].[Group Name].&amp;[IRELAND]&amp;[Ireland East Hospitals]</VALUE>
        <VALUE>[Hierarchy].[Hospital Name].&amp;[IRELAND]&amp;[IR003]&amp;[St Vincent's Hospital]</VALUE>
    </HIERARCHY>
</PREFS>

我想 select 只输出以 [Hierarchy].[Group Name] - 这是另一个查询的结果。

我的 sql 看起来像这样,我在一个循环的中间,我正在寻找的值在一个变量中,并且被重新编码成一个层次结构,所以它有点混乱: -

SELECT 
    a.prefs.value('(/PREFS/HIERARCHY/VALUE/text())[1]', 'varchar(max)') as [ReportValue]
FROM (SELECT @User_defaults as [prefs] ) a  -- a sql variable of XMl type contains the XML
CROSS APPLY (   
-- Returns the thing I'm looking for i.e. "[Hierarchy].[Group Name]"
        SELECT  p.prompt
        FROM @prompts p
        WHERE UPPER(p.prompt) LIKE CASE WHEN  @prompt = '[Hierarchy].[Group Name]' 
                                            THEN '%COUNTRY%' 
                                        WHEN  @prompt = '[Hierarchy].[Hospital Name]' 
                                            THEN '%GROUP%'
                                        ELSE 'XXXXXXXX' -- don't match
                                    END 
        AND p.Parametername LIKE 'HC__%'
            ) s
WHERE
    -- The bit where I just select the Value that matches, but it doesn't work! 
    LEFT(a.prefs.value('(/PREFS/HIERARCHY/VALUE/text())[1]', 'varchar(max)'),len(s.prompt) ) = s.prompt

它returns只有第一次匹配,第二次循环,没有结果,我不太明白如何部分匹配,感谢任何帮助。

如果您对包含检查感到满意,您可以这样做:

declare @User_defaults xml;

set @User_defaults = '
<PREFS>
    <HIERARCHY>
        <VALUE>[Hierarchy].[Country Name].&amp;[IRELAND]</VALUE>
        <VALUE>[Hierarchy].[Group Name].&amp;[IRELAND]&amp;[Ireland East Hospitals]</VALUE>
        <VALUE>[Hierarchy].[Hospital Name].&amp;[IRELAND]&amp;[IR003]&amp;[St Vincent''s Hospital]</VALUE>
    </HIERARCHY>
</PREFS>'

select @User_defaults.value('(/PREFS/HIERARCHY/VALUE[contains(text()[1], sql:column("s.prompt"))])[1]', 'nvarchar(100)')
from (
     -- Your query returning thing to look for
     select N'[Hierarchy].[Group Name]' as prompt
     ) as s

使用 sql:column 从派生的 table 中获取值到 xQuery 表达式中。