sql 服务器,为列定义了 xml 模式
sql server, defined xml schema to column
我正在尝试将 xml 架构添加到我的 table 的列中。
我要做的是:
- 从查询中提取架构
- 将架构添加到列
- 将xml插入此列
我的问题是如何排除架构中的某些选项,例如不检查空元素的可能性。
所以,例如:
create table #t1 (c1 int not null,c2 int null)
select CONVERT(xml,(select *
from #t1
where 0=1
for xml raw,elements,XMLSCHEMA('XXX')
))
这让我明白了
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" targetNamespace="XXX" elementFormDefault="qualified">
<xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="row">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="c1" type="sqltypes:int" />
<xsd:element name="c2" type="sqltypes:int" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
如何用 "minOccurs="0"" 定义所有元素??
谢谢!
如果您不介意 minOccurs="0" 和 nillable (http://www.dimuthu.org/blog/2008/08/18/xml-schema-nillabletrue-vs-minoccurs0/comment-page-1/) 之间的区别,那么您可以
create table #t1 (c1 int not null,c2 int null)
select CONVERT(xml,(select *
from #t1
where 0=1
for xml raw,elements xsinil,XMLSCHEMA('XXX')
))
当然有! - 不随和!引擎有义务 return 找到的模式。您可以将模式作为 XML
并对其进行修改,您可以使用基于字符串的方法(或某种 regex)。以下是一种古怪但有效的动态方法:
过程sp_describe_first_result_set用于获取未知结果集的元数据。您可以将其 return 存储在 table.
中
使用这些信息,您可以创建 table 的 copy,其中所有列都可以为空。使用这个新的 table 来获取您的架构:
create table #FirstResult(is_hidden BIT
,column_ordinal INT
,name NVARCHAR(MAX)
,is_nullable BIT
,system_type_id BIT
,system_type_name VARCHAR(MAX)
,max_length INT
,[precision] INT
,scale INT
,collation_name VARCHAR(MAX)
,user_type_id INT
,user_type_database VARCHAR(MAX)
,user_type_schema VARCHAR(MAX)
,user_type_name VARCHAR(MAX)
,assembly_qualified_type_name VARCHAR(MAX)
,xml_collection_id VARCHAR(MAX)
,xml_collection_database VARCHAR(MAX)
,xml_collection_schema VARCHAR(MAX)
,xml_collection_name VARCHAR(MAX)
,is_xml_document BIT
,is_case_sensitive BIT
,is_fixed_length_clr_type BIT
,source_server VARCHAR(MAX)
,source_database VARCHAR(MAX)
,source_schema VARCHAR(MAX)
,source_table VARCHAR(MAX)
,source_column VARCHAR(MAX)
,is_identity_column BIT
,is_part_of_unique_key BIT
,is_updateable BIT
,is_computed_column BIT
,is_sparse_column_set BIT
,ordinal_in_order_by_list INT
,order_by_is_descending BIT
,order_by_list_length INT
,tds_type_id INT
,tds_length INT
,tds_collation_id INT
,tds_collation_sort_id INT);
--您的用例
create table #t1 (c1 int not null,c2 int null);
GO
INSERT INTO #FirstResult
exec sp_describe_first_result_set @tsql=N'SELECT * FROM #t1';
DECLARE @cmd NVARCHAR(MAX)=
(
SELECT N'DECLARE @tmp TABLE('
+
STUFF(
(
SELECT N',' + name + ' ' + system_type_name + N' NULL'
FROM #FirstResult
FOR XML PATH(''),TYPE
).value('text()[1]','nvarchar(max)'),1,1,'')
+N');
SELECT * FROM @tmp AS SomeTable FOR XML RAW,ELEMENTS,XMLSCHEMA(''XXX'')'
);
EXEC (@cmd);
GO
drop table #t1;
drop table #FirstResult;
GO
结果
<xsd:schema targetNamespace="XXX" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="row">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="c1" type="sqltypes:int" minOccurs="0" />
<xsd:element name="c2" type="sqltypes:int" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
我正在尝试将 xml 架构添加到我的 table 的列中。 我要做的是:
- 从查询中提取架构
- 将架构添加到列
- 将xml插入此列
我的问题是如何排除架构中的某些选项,例如不检查空元素的可能性。
所以,例如:
create table #t1 (c1 int not null,c2 int null)
select CONVERT(xml,(select *
from #t1
where 0=1
for xml raw,elements,XMLSCHEMA('XXX')
))
这让我明白了
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" targetNamespace="XXX" elementFormDefault="qualified">
<xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="row">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="c1" type="sqltypes:int" />
<xsd:element name="c2" type="sqltypes:int" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
如何用 "minOccurs="0"" 定义所有元素??
谢谢!
如果您不介意 minOccurs="0" 和 nillable (http://www.dimuthu.org/blog/2008/08/18/xml-schema-nillabletrue-vs-minoccurs0/comment-page-1/) 之间的区别,那么您可以
create table #t1 (c1 int not null,c2 int null)
select CONVERT(xml,(select *
from #t1
where 0=1
for xml raw,elements xsinil,XMLSCHEMA('XXX')
))
当然有! - 不随和!引擎有义务 return 找到的模式。您可以将模式作为 XML
并对其进行修改,您可以使用基于字符串的方法(或某种 regex)。以下是一种古怪但有效的动态方法:
过程sp_describe_first_result_set用于获取未知结果集的元数据。您可以将其 return 存储在 table.
中使用这些信息,您可以创建 table 的 copy,其中所有列都可以为空。使用这个新的 table 来获取您的架构:
create table #FirstResult(is_hidden BIT
,column_ordinal INT
,name NVARCHAR(MAX)
,is_nullable BIT
,system_type_id BIT
,system_type_name VARCHAR(MAX)
,max_length INT
,[precision] INT
,scale INT
,collation_name VARCHAR(MAX)
,user_type_id INT
,user_type_database VARCHAR(MAX)
,user_type_schema VARCHAR(MAX)
,user_type_name VARCHAR(MAX)
,assembly_qualified_type_name VARCHAR(MAX)
,xml_collection_id VARCHAR(MAX)
,xml_collection_database VARCHAR(MAX)
,xml_collection_schema VARCHAR(MAX)
,xml_collection_name VARCHAR(MAX)
,is_xml_document BIT
,is_case_sensitive BIT
,is_fixed_length_clr_type BIT
,source_server VARCHAR(MAX)
,source_database VARCHAR(MAX)
,source_schema VARCHAR(MAX)
,source_table VARCHAR(MAX)
,source_column VARCHAR(MAX)
,is_identity_column BIT
,is_part_of_unique_key BIT
,is_updateable BIT
,is_computed_column BIT
,is_sparse_column_set BIT
,ordinal_in_order_by_list INT
,order_by_is_descending BIT
,order_by_list_length INT
,tds_type_id INT
,tds_length INT
,tds_collation_id INT
,tds_collation_sort_id INT);
--您的用例
create table #t1 (c1 int not null,c2 int null);
GO
INSERT INTO #FirstResult
exec sp_describe_first_result_set @tsql=N'SELECT * FROM #t1';
DECLARE @cmd NVARCHAR(MAX)=
(
SELECT N'DECLARE @tmp TABLE('
+
STUFF(
(
SELECT N',' + name + ' ' + system_type_name + N' NULL'
FROM #FirstResult
FOR XML PATH(''),TYPE
).value('text()[1]','nvarchar(max)'),1,1,'')
+N');
SELECT * FROM @tmp AS SomeTable FOR XML RAW,ELEMENTS,XMLSCHEMA(''XXX'')'
);
EXEC (@cmd);
GO
drop table #t1;
drop table #FirstResult;
GO
结果
<xsd:schema targetNamespace="XXX" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
<xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
<xsd:element name="row">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="c1" type="sqltypes:int" minOccurs="0" />
<xsd:element name="c2" type="sqltypes:int" minOccurs="0" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>