如何使用XQuery从XML变量中提取模式

问题描述 投票:0回答:1

技术:T-SQL,XML,XQuery

我在具有模式部分和数据部分的数据库表中有一个XML @variable。我只想额外增加schema部分,并为其创建XML Schema Collection。看来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')

感谢您的任何帮助。

sql-server xml tsql xsd xquery
1个回答
1
投票

在等待实际情况时,这是您的理想起点。作为最终结果,它将创建一个名为dbo.StateAndCities

的XML模式集合。

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;
© www.soinside.com 2019 - 2024. All rights reserved.