Как извлечь схему из переменной XML с помощью XQuery - PullRequest
0 голосов
/ 20 февраля 2020

Технологии: T- SQL, XML, XQuery

У меня есть XML @ переменная в таблице базы данных, которая имеет раздел схемы и раздел данных. Я хотел бы только добавить дополнительный раздел схемы и создать для него коллекцию схем XML. Похоже, XQuery будет самым быстрым способом. Как указать начальный тег и конечный тег в следующем файле (я хочу извлечь все только между <xs:schema xmlns и </xs:schema>?

CREATE FUNCTION [etl].[ufn_GetXmlSchema]
(
    @DataLakeBlobId uniqueidentifier
)
RETURNS xml
AS
BEGIN
    DECLARE  @XmlSchema xml
        ,@XmlData xml

    SET @XmlSchema = ( SELECT [XmlData]
                    FROM [landing].[v_tbForm] WITH (NOLOCK)
                    WHERE [DataLakeBlobId] = @DataLakeBlobId
                 )

    --RETURN @XmlSchema.query('</xs:schema>')-- missing matching begin tag
    --RETURN @XmlSchema.query('<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet">')-- Expected end tag 'xs:schema'
    RETURN @XmlSchema.query('<xs:schema xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet"></xs:schema>')-- nothing in between was returned
END
GO

SELECT [etl].[ufn_GetXmlSchema]('A257667D-C3AA-471C-9F82-91FA35181833')

Любая помощь приветствуется.

1 Ответ

1 голос
/ 20 февраля 2020

В ожидании реального сценария, вот хороший старт для вас. В результате он создает коллекцию схем XML с именем dbo.StateAndCities .

SQL

USE tempdb;
GO

-- DDL and sample data population, start
IF EXISTS (SELECT * FROM sys.xml_schema_collections 
                    WHERE name = N'StateAndCities' 
                    AND schema_id = SCHEMA_ID(N'dbo'))
DROP XML SCHEMA COLLECTION dbo.StateAndCities;

DECLARE @tbl TABLE (
   ID INT IDENTITY PRIMARY KEY
   , state CHAR(2)
   , city VARCHAR(30)
);
INSERT INTO @tbl (state, city)
VALUES
('FL', 'Miami')
, ('CA', 'Los Angeles')
, ('TX', 'Austin');
-- DDL and sample data population, end

DECLARE @xml XML
    , @XSD XML;

-- Generate XML plus embedded XSD schema
SET @xml = (SELECT NULL,
(
    SELECT * 
    FROM @tbl AS [row]
    FOR XML AUTO, ELEMENTS, TYPE, XMLSCHEMA('MyURI'))
    FOR XML PATH(''), TYPE, ROOT('root')
);

-- just to see, XML plus embedded XSD schema
SELECT @xml;

-- retrive just XSD
;WITH xmlnamespaces ('http://www.w3.org/2001/XMLSchema' AS xsd)
SELECT @xsd = (SELECT @xml.query('/root/xsd:schema'));

-- just to see, XSD schema
SELECT @xsd AS xsd;

-- create schema collection
CREATE XML SCHEMA COLLECTION dbo.StateAndCities AS @xsd;
...