Как использовать атрибут XML в качестве критерия поиска в t-sql? - PullRequest
0 голосов
/ 29 марта 2019

У меня есть таблица SQL Server:

    CREATE TABLE [dbo].[XMLFiles](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [XML] [xml] NOT NULL,
    [processed] [int] NOT NULL,
    [createtime] [datetime] NOT NULL,
    [handletime] [datetime] NULL,
    [objectId] [varchar](50) NOT NULL,
    [ResultText] [varchar](200) NULL,
    [BatchID] [varchar](50) NOT NULL,
    [Type] [varchar](32) NOT NULL,
    CONSTRAINT [PK_XMLFiles] PRIMARY KEY CLUSTERED 

Интересными столбцами в этом контексте являются XML и BatchID.BatchID является уникальным идентификатором.Мои XML-данные в столбце XML имеют следующий раздел:

...
            <CLASSIFICATION>
                <CLASS name="Face Mills Indexable" id="TA_MILL_20_20">
                    <ATTRIBUTE id="-45001" name="Tool Description" datatype="STRING">T990 d100 highfeed</ATTRIBUTE>
                    <ATTRIBUTE id="-41210" name="Comments" datatype="STRING"/>
                    <ATTRIBUTE id="-41101" name="Supplier" datatype="STRING"/>
                    <ATTRIBUTE id="-45211" name="Plant" datatype="ENUM">4 Lahti</ATTRIBUTE>
                    <ATTRIBUTE id="160000" name="Machine Tool" datatype="ENUM">BW4 MCR 750</ATTRIBUTE>
                    <ATTRIBUTE id="-45212" name="Machine Group" datatype="ENUM"/>
                    <ATTRIBUTE id="-45210" name="Status" datatype="ENUM"/>
...

Допустим, меня интересует значение атрибута где id = "160000", то есть пятый атрибут.Я могу получить значение с помощью SQL-запроса:

SELECT
xml.value('(/PLM_PUBLISH_ITEM/ITEMS/ITEM/CLASSIFICATION/CLASS/ATTRIBUTE)[5]','varchar(30)') AS TCODE
FROM XMLFiles
WHERE batchid = '1553762782573'

Результат верный: BW4 MCR 750

Но я не могу быть уверен, что эта строка всегда является пятой строкой здесь.Поэтому я хотел бы использовать SQL, где я могу указать идентификатор атрибута в качестве критерия поиска.

Примерно так:

SELECT something FROM XMLFiles WHERE BacthID='1553762782573'
AND something = '160000'

Как это получить?У меня закончились идеи ...

1 Ответ

1 голос
/ 29 марта 2019

Вы можете использовать предикат XPath [@id='160000'], чтобы получить узлы, где атрибут id имеет значение 160000.

SELECT xml.value('(/PLM_PUBLISH_ITEM/ITEMS/ITEM/CLASSIFICATION/CLASS/ATTRIBUTE[@id=''160000''])[1]','varchar(30)') tcode
       FROM xmlfiles
       WHERE batchid = '1553762782573';

Вы также можете использовать exist() если вы не интересуетесь фактическим значением, а просто хотите выбрать строки, где такой элемент существует в XML.

SELECT *
       FROM xmlfiles
       WHERE batchid = '1553762782573'
             AND xml.exist('/PLM_PUBLISH_ITEM/ITEMS/ITEM/CLASSIFICATION/CLASS/ATTRIBUTE[@id=''160000'']') <> 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...