Sql server 如何在T-SQL中从XML中读取选项?

Sql server 如何在T-SQL中从XML中读取选项?,sql-server,tsql,parsing,openxml,Sql Server,Tsql,Parsing,Openxml,我有下一个XML文件: <?xml version="1.0" encoding="utf-8"?> <DynamicEntity Name="ProductsMilk"> <Field Name="Name" Type="nvarchar(256)" AllowNulls="false" /> <Field Name="Description" Type="ntext" AllowNulls="false" /> <Field

我有下一个
XML
文件:

<?xml version="1.0" encoding="utf-8"?>
<DynamicEntity Name="ProductsMilk">
  <Field Name="Name" Type="nvarchar(256)" AllowNulls="false" />
  <Field Name="Description" Type="ntext" AllowNulls="false" />
  <Field Name="Price" Type="float" AllowNulls="false" />
</DynamicEntity>

我需要从
XML节点的任何选项中读取一些值,例如,我需要使用
T-SQL
字段节点读取类型选项的值


如何使用
MSSQL
中的内部OpenXML提供程序执行此操作?

以下内容将从XML中提取所有数据:

DECLARE @doc VARCHAR(1000) = '<?xml version="1.0" encoding="utf-8"?>
    <DynamicEntity Name="ProductsMilk">
      <Field Name="Name" Type="nvarchar(256)" AllowNulls="false" />
      <Field Name="Description" Type="ntext" AllowNulls="false" />
      <Field Name="Price" Type="float" AllowNulls="false" />
    </DynamicEntity>';

DECLARE @iDoc INT;

EXECUTE sp_xml_preparedocument @idoc OUTPUT, @doc;

SELECT  *
FROM    OPENXML(@iDoc, 'DynamicEntity/Field')
        WITH 
        (   DynamicEntityName  VARCHAR(100) '../@Name', 
            FieldName VARCHAR(100) '@Name', 
            [Type] VARCHAR(100) '@Type', 
            AllowNulls VARCHAR(100) '@AllowNulls'
        );
DECLARE@doc VARCHAR(1000)='
';
声明@iDoc INT;
执行sp_xml_preparedocument@idoc OUTPUT,@doc;
挑选*
来自OPENXML(@iDoc,“DynamicEntity/Field”)
具有
(DynamicEntityName VARCHAR(100)../@Name',
FieldName VARCHAR(100)“@Name”,
[Type]VARCHAR(100)“@Type”,
AllowNulls VARCHAR(100)“@AllowNulls”
);
基本上,您只需要为xml属性指定一个列映射。

这里有一个解决方案:

DECLARE @x XML = '<?xml version="1.0" encoding="utf-8"?>
<DynamicEntity Name="ProductsMilk">
  <Field Name="Name" Type="nvarchar(256)" AllowNulls="false" />
  <Field Name="Description" Type="ntext" AllowNulls="false" />
  <Field Name="Price" Type="float" AllowNulls="false" />
</DynamicEntity>'


SELECT t.c.value(N'../@Name', N'nvarchar(100)'),
       t.c.value(N'@Name', N'nvarchar(100)'),
       t.c.value(N'@Type', N'nvarchar(100)'),
       t.c.value(N'@AllowNulls', N'nvarchar(100)')
FROM @x.nodes(N'/DynamicEntity/Field') t(c)
DECLARE@xxml='1〕
'
选择t.c.值(N'../@Name',N'nvarchar(100)'),
t、 c.价值(N'@Name',N'nvarchar(100)'),
t、 c.值(N'@Type',N'nvarchar(100)'),
t、 c.价值(N'@AllowNulls',N'nvarchar(100)')
来自@x.nodes(N'/DynamicEntity/Field')t(c)

为什么需要使用
OpenXML
执行此操作?为什么不使用ready provider,它已经存在于MSSQL中,并且提供了很大的可能性?我知道,有一些来自XML类型的方法,比如Giorgi Nakeuri在这里提供的
nodes()