簡體   English   中英

使用SQL Server 2012的帶有嵌入式XSD的OPENXML

[英]OPENXML with an embedded XSD using SQL Server 2012

我希望這個論壇能對我有所幫助。 我對OpenXML一無所知,我必須將多個文件加載到SQL Server2012。源將文件格式更改為包括嵌入式xsd架構,但遇到了麻煩。 如果我將其修改為開頭並刪除所有xsd內容,則可以調用這些值。 大多數文件非常大,無法全部編輯,因此我需要弄清楚如何在不編輯的情況下查詢它。 下面是我正在從中刪除xsd行的文件上使用的查詢。 可以在這里https://drive.google.com/file/d/1CIeDWTSAHFCIyz8F2zrtLCDpqe-uUeJv/view?usp=sharing獲取未經編輯的xml的副本。

論壇上的這篇帖子看起來像我所需要的,但我不太了解它是否與我的文件一起使用。 帶有xmlns:dt的OPENXML

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">

您必須使用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以使其僅保留幾行並對數據進行匿名處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM