【问题标题】:How to extract schema from XML variable using XQuery如何使用 XQuery 从 XML 变量中提取模式
【发布时间】:2020-06-04 08:15:51
【问题描述】:

技术:T-SQL、XML、XQuery

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

感谢任何帮助。

【问题讨论】:

  • 在提出问题时,您需要提供一个最小的、可重现的示例。请参考以下链接:stackoverflow.com/help/minimal-reproducible-example 请提供以下内容: (1) DDL 和样本数据填充,即 CREATE table(s) 加上 INSERT 语句。 (2) 你需要做什么,即逻辑,以及你的代码实现。 (3) 基于样本数据的期望输出。 (4) 你的 SQL Server 版本 (SELECT @@version;)

标签: sql-server xml tsql xsd xquery


【解决方案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;

【讨论】:

  • 非常全面的答案,我这边+1
猜你喜欢
  • 1970-01-01
  • 2016-08-17
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多