我希望这个论坛能对我有所帮助。我对OpenXML一无所知,我必须将多个文件加载到SQL Server2012。源将文件格式更改为包括嵌入式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">
答案 0 :(得分:0)
在查询名称时,必须使用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以使其仅保留几行并对数据进行匿名处理。