技术: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')
感谢您的任何帮助。
在等待实际情况时,这是您的理想起点。作为最终结果,它将创建一个名为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;