Sql server 如何在OPENXML中使用命名空间属性?

Sql server 如何在OPENXML中使用命名空间属性?,sql-server,xml,tsql,Sql Server,Xml,Tsql,我试图使用这个函数将XML解析为表格形式,但在存在名称空间属性时,我不断遇到误导性错误 例如,SQL Server声称此格式良好的XML文档具有以下特点: DECLARE @hdoc int; DECLARE @doc varchar(1000); SET @doc = ' <?xml version="1.0" encoding="UTF-8"?> <Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns

我试图使用这个函数将XML解析为表格形式,但在存在名称空间属性时,我不断遇到误导性错误

例如,SQL Server声称此格式良好的XML文档具有以下特点:

DECLARE @hdoc int;
DECLARE @doc varchar(1000);

SET @doc =
'
<?xml version="1.0" encoding="UTF-8"?>

<Data xmlns="http://www.digitalmeasures.com/schema/data" xmlns:dmd="http://www.digitalmeasures.com/schema/data-metadata" dmd:date="2016-06-13">
    <Record userId="123456" username="jeffp" termId="129" dmd:surveyId="1234567">
        <dmd:IndexEntry indexKey="AACSBSUFF" entryKey="Participating" text="Participating"/>
        <dmd:IndexEntry indexKey="DEPARTMENT" entryKey="WCBD" text="WCBD"/>
        <dmd:IndexEntry indexKey="QUALIFICATION" entryKey="Instructional Practitioner" text="Instructional Practitioner"/>
        <dmd:IndexEntry indexKey="RANK" entryKey="Academic Staff" text="Academic Staff"/>
        <GENSERVE id="33426841601" dmd:lastModified="2011-03-15T10:23:01" dmd:startDate="2010-07-01">
            <TYPE>University</TYPE>
            <TYPEOTHER/>
            <ORG>University Academic Advising Council   </ORG>
            <ROLE>Committee Member</ROLE>
            <ROLEOTHER/>
            <OFFICE>President/Elect/Past</OFFICE>
            <RESPONSIBILITIES/>
            <NUMHOURS/>
            <ELECAPP>Elected</ELECAPP>
            <AUDIENCE>Local</AUDIENCE>
            <EXOFFICIO/>
            <DTM_START>July</DTM_START>
            <DTD_START/>
            <DTY_START>2010</DTY_START>
            <START_START>2010-07-01</START_START>
            <START_END>2010-07-31</START_END>
            <DTM_END/>
            <DTD_END/>
            <DTY_END/>
            <END_START></END_START>
            <END_END></END_END>
        </GENSERVE>
    </Record>
</Data>
';

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc;

SELECT    *
FROM       OPENXML (@hdoc, '/Data/Record/GENSERVE', 2)
           with(TYPE varchar(250),
                ORG varchar(250)  )

exec sp_xml_removedocument @hdoc;

如何读取名称空间属性?

您的XML字符串被截断,因为它的长度超过
varchar(1000)
,因此XML解析错误。错误消息与命名空间无关

现在是名称空间问题。。请注意,XML具有默认名称空间(声明的名称空间没有前缀)。查询中涉及的所有元素都隐式地从
Data
元素继承默认名称空间。您需要将前缀映射到默认命名空间URI,并在OPENXML查询中使用该前缀引用命名空间中的元素:

DECLARE @doc varchar(5000);

.....

EXEC sp_xml_preparedocument @hdoc OUTPUT, 
     @doc, 
    '<Data xmlns:d="http://www.digitalmeasures.com/schema/data" />';

SELECT    *
FROM       OPENXML (@hdoc, '/d:Data/d:Record/d:GENSERVE', 2)
           with(TYPE varchar(250) 'd:TYPE',
                ORG varchar(250) 'd:ORG' )

XML字符串被截断,因为它的长度超过
varchar(1000)
,因此出现XML解析错误。错误消息与命名空间无关

现在是名称空间问题。。请注意,XML具有默认名称空间(声明的名称空间没有前缀)。查询中涉及的所有元素都隐式地从
Data
元素继承默认名称空间。您需要将前缀映射到默认命名空间URI,并在OPENXML查询中使用该前缀引用命名空间中的元素:

DECLARE @doc varchar(5000);

.....

EXEC sp_xml_preparedocument @hdoc OUTPUT, 
     @doc, 
    '<Data xmlns:d="http://www.digitalmeasures.com/schema/data" />';

SELECT    *
FROM       OPENXML (@hdoc, '/d:Data/d:Record/d:GENSERVE', 2)
           with(TYPE varchar(250) 'd:TYPE',
                ORG varchar(250) 'd:ORG' )

哦,太棒了,谢谢,这很有道理,我觉得自己很笨!当我回到工作岗位时,我很高兴能尝试一下,谢谢!再次感谢您不仅修复了我的愚蠢问题并回答了我的问题,而且最重要的是,我感谢您改进的解决方案“使用SQL Server的XQuery和XML数据类型”,这是我完全没有意识到的。解决方法!哦,太棒了,谢谢,这很有道理,我觉得自己很笨!当我回到工作岗位时,我很高兴能尝试一下,谢谢!再次感谢您不仅修复了我的愚蠢问题并回答了我的问题,而且最重要的是,我感谢您改进的解决方案“使用SQL Server的XQuery和XML数据类型”,这是我完全没有意识到的。解决方法!
<?xml version="1.0" encoding="UTF-8"?>
<Data>
    <Record userId="123456" username="jeffp" termId="129">
        <GENSERVE id="33426841601" >
            <TYPE>University</TYPE>
            <TYPEOTHER/>
            <ORG>University Academic Advising Council   </ORG>
            <ROLE>Committee Member</ROLE>
            <ROLEOTHER/>
            <OFFICE>President/Elect/Past</OFFICE>
            <RESPONSIBILITIES/>
            <NUMHOURS/>
            <ELECAPP>Elected</ELECAPP>
            <AUDIENCE>Local</AUDIENCE>
            <EXOFFICIO/>
            <DTM_START>July</DTM_START>
            <DTD_START/>
            <DTY_START>2010</DTY_START>
            <START_START>2010-07-01</START_START>
            <START_END>2010-07-31</START_END>
            <DTM_END/>
            <DTD_END/>
            <DTY_END/>
            <END_START></END_START>
            <END_END></END_END>
        </GENSERVE>
    </Record>
</Data>
TYPE          ORG
University    University Academic Advising Council
DECLARE @doc varchar(5000);

.....

EXEC sp_xml_preparedocument @hdoc OUTPUT, 
     @doc, 
    '<Data xmlns:d="http://www.digitalmeasures.com/schema/data" />';

SELECT    *
FROM       OPENXML (@hdoc, '/d:Data/d:Record/d:GENSERVE', 2)
           with(TYPE varchar(250) 'd:TYPE',
                ORG varchar(250) 'd:ORG' )
DECLARE @xml XML = 'your xml string here'

;WITH XMLNAMESPACES (DEFAULT 'http://www.digitalmeasures.com/schema/data' )
SELECT 
    t.c.value('TYPE[1]', 'VARCHAR(100)' )  AS TYPE,
    t.c.value( 'ORG[1]', 'VARCHAR(100)' ) AS ORG
FROM @xml.nodes('/Data/Record/GENSERVE') t(c)