Синтаксический анализ xml, хранящихся в записях таблицы, в операторе select - SQL Server - PullRequest
2 голосов
/ 26 июля 2011

Я столкнулся с проблемой при попытке проанализировать xml, который хранится в записях таблицы. Структура xml выглядит следующим образом:

<?xml version="1.0" encoding="utf-16"?>  
<WidgetsLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <WidgetsList>      
            <WidgetConfiguration>        
                <WidgetId>4</WidgetId>        
                <DockOrder>0</DockOrder>        
                <DockZoneId>0</DockZoneId>        
                <Width />        
                <Height />        
                <IsRemovable>true</IsRemovable>      
            </WidgetConfiguration>      
            <WidgetConfiguration>        
                <WidgetId>3</WidgetId>        
                <DockOrder>0</DockOrder>        
                <DockZoneId>1</DockZoneId>        
                <Width />        
                <Height />        
                <IsRemovable>true</IsRemovable>      
            </WidgetConfiguration>    
        </WidgetsList>  
    </WidgetsLayout>

И xml хранится в записях таблицы как varchar.

Мне нужно получить временную таблицу, которая будет содержать отдельный набор WidgetId из структуры xml.

ОБНОВЛЕНО:

Я написал следующеепакетный оператор для извлечения набора из строк XML WidgetConfiguration, поэтому я смог бы получить набор WidgetId, но я столкнулся с проблемой с оператором вставки:

GO

    declare @dashboard_layout table (
        id int,
        config_xml xml
    )

    INSERT INTO @dashboard_layout(id)
        SELECT 
            widget_config.value('(WidgetId)[1]', 'int')
        FROM
            dbo.dashboard_configuration c
        CROSS APPLY 
            CAST(RIGHT(c.configuration_xml_string, LEN(c.configuration_xml_string) - 41), XML).nodes('/WidgetsLayout/WidgetsList/WidgetConfiguration') AS list(widget_config)

    select * from @dashboard_layout

У меня синтаксическая ошибкав последней строке оператора вставки при вызове «узлов» в результате «приведения»

Заранее спасибо.

1 Ответ

3 голосов
/ 26 июля 2011

Попробуйте это - это будет работать:

DECLARE @input XML = '<WidgetsLayout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <WidgetsList>      
            <WidgetConfiguration>        
                <WidgetId>4</WidgetId>        
                <DockOrder>0</DockOrder>        
                <DockZoneId>0</DockZoneId>        
                <Width />        
                <Height />        
                <IsRemovable>true</IsRemovable>      
            </WidgetConfiguration>      
            <WidgetConfiguration>        
                <WidgetId>3</WidgetId>        
                <DockOrder>0</DockOrder>        
                <DockZoneId>1</DockZoneId>        
                <Width />        
                <Height />        
                <IsRemovable>true</IsRemovable>      
            </WidgetConfiguration>    
        </WidgetsList>  
    </WidgetsLayout>'

SELECT
    WList.value('(WidgetId)[1]', 'int')
FROM
    @input.nodes('/WidgetsLayout/WidgetsList/WidgetConfiguration') AS Widget(WList)

Так что в основном:

  • сохраните ваш XML как тип данных XML - или, если вы не можете, вам придется преобразовать столбец VARCHAR в XML do для обработки

  • захватить список <WidgetsLayout>/<WidgetsList>/<WidgetConfiguration> узлов как "псевдотаблицу"

  • извлекает элемент <WidgetId> из каждого члена этой псевдотаблицы как INT

Обновление: ОК, чтобы сделать это из таблицы, используйте это:

INSERT INTO @dashboard_layout(ID)
    SELECT 
        WList.value('(WidgetId)[1]', 'int')
    FROM
        dbo.dashboard_configuration c
    CROSS APPLY 
        CAST(c.YourColumn AS XML).nodes('/WidgetsLayout/WidgetsList/WidgetConfiguration') AS Widget(WList) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...