繁体   English   中英

如何在SQL Server导入和导出向导中从XML文件导入?

[英]How to import from XML file in SQL Server Import and Export Wizard?

我有一个表的数据和架构作为单个XML文件。 如何使用SQL Server导入和导出向导导入它?

我应该使用“平面文件源”作为数据源吗? 要不然是啥?

[有关信息,我从VistaDB导出了XML,但是到目前为止,创建数据的系统可能还没有成为问题。

据我所知,您不能使用导入导出向导来执行此操作。 假设您希望数据显示所有关系数据而不是XML数据类型,则需要创建表并使用sp_xml_preparedocument和OPENXML。

请参阅如何使用OPENXML将XML数据加载到现有SQL表中?

据我所知,MS SQL Server Management Studio没有将XML上传到表的工具。 有一个选项涉及OPENROWSET和XML处理的组合,但是它要求文件位于服务器的文件系统中。

我需要将Java Web应用程序生成的一系列日志文件加载到表中,但是无权将它们上传到服务器,我将日志保存在本地计算机中。 我设法分两个步骤上传数据,这虽然不太麻烦,但是对于永久解决方案来说绝对太慢了。

我创建了一个由两列组成的表:一个自动数字主键和一个varchar(max)。 我使用导入数据将文本文件上载到表,以便文件中的每一行都是表中的一条记录。 主键同时代表行号。 所以我可以这样写:

select LineNumber, TextLine from [LogFile] order by LineNumber

然后,我准备了另一个表,该表的结构与XML中的记录相匹配。 我的XML文件的特殊之处在于,每个“值”标记都在其自己的文本行中,而“开始”和“结束”“记录”标记则分别位于单独的行中。

例如:

    <log>
    <record>
      <date>2018-07-27T09:54:20</date>
      <millis>1532706860250</millis>
      <sequence>13587</sequence>
      <logger>registroweb.ServReg</logger>
      <level>INFO</level>
      <class>somepackage.someclass</class>
      <method>methodname</method>
      <thread>11153</thread>
      <message>some very long text</message>
      <param>another long text</param>
    </record>
   ...
   </log>

这意味着我可以选择所有记录,其中text_line ='<log>'将给我所有打开的记录标签,但最重要的是,使用t2.line_number = t1.line_number + 1自联接表将始终为我提供包含日期标签line_number + 2将给出毫秒,依此类推。

因此,通过以下查询,我能够将平面线性表转换为适当的表:

insert into LogFileProcessed(
    [date],
    [millis],
    [sequence],
    [logger] ,
    [level]  ,
    [class]  ,
    [method] ,
    [thread] ,
    [message],
    [param]
)
select
    --record.TextLine, 
    convert(datetime, replace(replace(ltrim(dte.TextLine), '<date>',     ''), '</date>',     ''), 126) [date],
    convert(bigint,   replace(replace(ltrim(mls.TextLine), '<millis>',   ''), '</millis>',   '')) [millis],
    convert(bigint,   replace(replace(ltrim(seq.TextLine), '<sequence>', ''), '</sequence>', '')) [sequence],
    replace(replace(ltrim(logr.TextLine),   '<logger>',   ''), '</logger>',   '') [logger],
    replace(replace(ltrim(lvl.TextLine),    '<level>',    ''), '</level>',    '') [level],
    replace(replace(ltrim(cls.TextLine),    '<class>',    ''), '</class>',    '') [class],
    replace(replace(ltrim(mtd.TextLine),    '<method>',   ''), '</method>',   '') [method],
    replace(replace(ltrim(trd.TextLine),    '<thread>',   ''), '</thread>',   '') [thread],
    replace(replace(ltrim(msg.TextLine),    '<message>',  ''), '</message>',  '') [message],
    replace(replace(ltrim(prm.TextLine),    '<param>',    ''), '</param>',    '') [param]  
from LogFile record
left join LogFile dte    on dte.LineNumber    = record.LineNumber+1
left join LogFile mls    on mls.LineNumber    = record.LineNumber+2
left join LogFile seq    on seq.LineNumber    = record.LineNumber+3
left join LogFile logr   on logr.LineNumber   = record.LineNumber+4
left join LogFile lvl    on lvl.LineNumber    = record.LineNumber+5
left join LogFile cls    on cls.LineNumber    = record.LineNumber+6
left join LogFile mtd    on mtd.LineNumber    = record.LineNumber+7
left join LogFile trd    on trd.LineNumber    = record.LineNumber+8
left join LogFile msg    on msg.LineNumber    = record.LineNumber+9
left join LogFile prm    on prm.LineNumber    = record.LineNumber+10 and prm.TextLine <> '</record>' -- param is actually the only tag that is optional and some times is not present in the record.
where record.TextLine = '<record>'
order by 1, 2

考虑到我当时的特殊限制和文件的结构,此功能足以完成一项一次性任务,使我可以对数据执行常规查询,而不必重复运行XML解析或处理代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM