【问题标题】:OPENXML with an embedded XSD using SQL Server 2012带有使用 SQL Server 2012 的嵌入式 XSD 的 OPENXML
【发布时间】:2018-12-18 15:17:45
【问题描述】:

我希望这个论坛可以帮助我。我对 OpenXML 一无所知,我必须将几个文件加载到 SQL Server 2012。源更改了文件格式以包含嵌入式 xsd 架构,但我遇到了麻烦。如果我修改它以开始并取出所有 xsd 东西,我可以调用这些值。大多数文件都非常大,无法全部编辑,所以我需要弄清楚如何在不编辑的情况下查询它。下面是我在从中删除 xsd 行的文件上使用的查询。可以在此处获得未经编辑的 xml 的副本 https://drive.google.com/file/d/1CIeDWTSAHFCIyz8F2zrtLCDpqe-uUeJv/view?usp=sharing

论坛上的这个帖子看起来像我需要的,但我不太明白它与我的文件一起使用。 OPENXML with xmlns:dt

DECLARE @fileData XML

SELECT @fileData = BulkColumn 
FROM OpenRowSet(BULK 'C:\ogrid - Copy.xml',Single_blob) x;

SELECT 
    xdata.value('ogrid_cde[1]','int') ogrid_cde,
    xData.value('ogrid_nam[1]','nvarchar(255)') ogrid_name,
    xData.value('ogrid_adr_nam[1]','nvarchar(255)') ogrid_adr_name,
    xData.value('mail_stop[1]','nvarchar(255)') mail_stop,
    xData.value('line1_adr[1]','nvarchar(255)') line1_adr,
    xData.value('line2_adr[1]','nvarchar(255)') line2_adr,
    xData.value('line3_adr[1]','nvarchar(255)') line3_adr,
    xData.value('city_nam[1]','nvarchar(255)') city_name,
    xData.value('st_nam[1]','nvarchar(255)') st_name,
    xData.value('zip_cde[1]','nvarchar(255)') zip_cde,
    xData.value('ctry_nam[1]','nvarchar(255)') ctry_name,
    xData.value('phone_num[1]','decimal(28,10)') phone_num,
    xData.value('fax_num[1]','decimal(28,10)') fax_num,
    xData.value('stat_eff_dte[1]','datetime') stat_eff_dte,
    xData.value('issng_ag_cde[1]','nvarchar(255)') issng_ag_cde,
    xData.value('lst_modified_dte[1]','datetime') last_modified_dte,
    xData.value('created_dte[1]','datetime') created_dte,
    xData.value('ogrid_stat_cde[1]','nvarchar(255)') ogrid_stat_cde
FROM 
    @fileData.nodes('root/ogrid') AS x(xData)

这是从源接收时包含 xsd 的文件的示例。

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" 
         xmlns:schema="urn:schemas-microsoft-com:sql:SqlRowSet1" 
         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="ogrid">
            <xsd:complexType>
                <xsd:sequence>
                    <xsd:element name="ogrid_cde" type="sqltypes:int" nillable="1"/>
                    <xsd:element name="ogrid_nam" nillable="1">
                        <xsd:simpleType>
                            <xsd:restriction base="sqltypes:char" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">

【问题讨论】:

    标签: sql-server-2012 xsd sql-server-openxml


    【解决方案1】:

    您必须使用WITH XMLNAMESPACES 声明命名空间,然后在查询名称时为名称加上架构前缀(在我的示例中为ns1)。所以你的代码应该是这样的:

    DECLARE @fileData XML
    
    SELECT @fileData = BulkColumn 
    FROM OpenRowSet(BULK 'E:\inbox\ogrid.xml',Single_blob) x;
    
    WITH XMLNAMESPACES ('urn:schemas-microsoft-com:sql:SqlRowSet1' as ns1)  
    SELECT 
        xdata.value('ns1:ogrid_cde[1]','int') ogrid_cde,
        xData.value('ns1:ogrid_nam[1]','nvarchar(255)') ogrid_name,
        xData.value('ns1:ogrid_adr_nam[1]','nvarchar(255)') ogrid_adr_name,
        xData.value('ns1:mail_stop[1]','nvarchar(255)') mail_stop,
        xData.value('ns1:line1_adr[1]','nvarchar(255)') line1_adr,
        xData.value('ns1:line2_adr[1]','nvarchar(255)') line2_adr,
        xData.value('ns1:line3_adr[1]','nvarchar(255)') line3_adr,
        xData.value('ns1:city_nam[1]','nvarchar(255)') city_name,
        xData.value('ns1:st_nam[1]','nvarchar(255)') st_name,
        xData.value('ns1:zip_cde[1]','nvarchar(255)') zip_cde,
        xData.value('ns1:ctry_nam[1]','nvarchar(255)') ctry_name,
        xData.value('ns1:phone_num[1]','decimal(28,10)') phone_num,
        xData.value('ns1:fax_num[1]','decimal(28,10)') fax_num,
        xData.value('ns1:stat_eff_dte[1]','datetime') stat_eff_dte,
        xData.value('ns1:issng_ag_cde[1]','nvarchar(255)') issng_ag_cde,
        xData.value('ns1:lst_modified_dte[1]','datetime') last_modified_dte,
        xData.value('ns1:created_dte[1]','datetime') created_dte,
        xData.value('ns1:ogrid_stat_cde[1]','nvarchar(255)') ogrid_stat_cde
    FROM 
        @fileData.nodes('root/ns1:ogrid') AS x(xData)
    

    另外,decimal(28,10) 类型对于电话和传真号码没有多大意义。

    更重要的是,告诉您的主管您已发布了所有数据 - 姓名、地址、电话号码等。您的公司可能需要了解这些信息。下次当您想这样做时,修改 XML 以仅保留几行并匿名数据。

    【讨论】:

    • 非常感谢!!这是任何人都可以下载 XML 的公共数据,因此没有机密数据。
    猜你喜欢
    • 2012-10-27
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    相关资源
    最近更新 更多