用t-sql导入多个xml(2005)

时间:2013-09-24 10:05:30

标签: sql

我确实在文件夹中选择了一个文件, 任何人都可以帮助我如何选择导入文件夹中的所有文件?

SELECT MACHINE = XmlContent.value('(/recordedData/machine)[1]', 'varchar(50)'),
        RecordingDate = XmlContent.value('(/recordedData/date)[1]', 'varchar(50)'),
        RecordingTime = XmlContent.value('(/recordedData/hour)[1]', 'varchar(50)'),
        VariableName = XVar.value('(Name)[1]', 'varchar(50)'),
        VariableValue = XVar.value('(Value)[1]', 'varchar(50)')
FROM ( 
SELECT CAST(XmlContent AS XML)
FROM OPENROWSET(
     BULK 'C:\tmp\20130918_0932_ZSK40-2.xml',

     SINGLE_BLOB) AS T(XmlContent)
     ) AS T(XmlContent)
CROSS APPLY 
    XmlContent.nodes('/recordedData/CollectedData/variable') AS XTbl(XVar)

我认为它应该是文件路径上的一个技巧。 apreciate帮助!

1 个答案:

答案 0 :(得分:0)

如果您的服务器上未禁用xp_cmdshell,则可以解决此问题。基本上,您将能够通过它运行dir命令并解决查询问题。你可以这样做:

declare @sql nvarchar(max) = ''
declare @t table (cmdLineResult varchar(100))
exec xp_cmdshell 'dir C:\tmp\*.xml'
declare @left nvarchar(4000) = N'SELECT MACHINE = XmlContent.value(''(/recordedData/machine)[1]'',    ''varchar(50)''),
    RecordingDate = XmlContent.value(''(/recordedData/date)[1]'', ''varchar(50)''),
    RecordingTime = XmlContent.value(''(/recordedData/hour)[1]'', ''varchar(50)''),
    VariableName = XVar.value(''(Name)[1]'', ''varchar(50)''),
    VariableValue = XVar.value(''(Value)[1]'', ''varchar(50)'')
FROM ( 
SELECT CAST(XmlContent AS XML)
FROM OPENROWSET(
 BULK '
declare @right nvarchar(4000) = N',
 SINGLE_BLOB) AS T(XmlContent)
 ) AS T(XmlContent)
CROSS APPLY 
    XmlContent.nodes(''/recordedData/CollectedData/variable'') AS XTbl(XVar)'
SELECT @sql += ' UNION ALL ' + @left + '''' + cmdLineResult + '''' + @right FROM @t
SET @sql = SUBSTRING (@sql,12,len(@sql)-12)
exec sp_executesql @sql

您需要检查的是: - 目前我无法检查xp_cmdshell的输出结果如何。您可能需要调整@t的定义,并可能将WHERE子句添加到底部第3行的SELECT语句中。在这里和那里也可能存在一些小问题,因为我是从脑袋里写的。但我希望它能给你提供如何解决问题的最佳方法。