用于将XML文件上载到单个SQL表的SQL查询

时间:2013-03-20 05:29:11

标签: sql sql-server

我有一个示例xml文件,我需要将其上传到SQL表中。

xml文件下面是用于选择要插入表中的XML值的SQL查询

问题:我无法获取<Actual>,<ExpectedValue>值,因为它们不止一次出现

如果有人能帮助纠正/指导我获得正确的价值观,那将不胜感激

感谢。

<?xml version="1.0" encoding="utf-8" ?>
<Results>
    <General>
        <Version>1.01</Version>
        <InputFilename>TestFile.xml</InputFilename>
        <Filename>xyz.XML</Filename>
        </General>
    <Tests>
        <Test Name="Test 1">
            <Number>0</Number>
            <MinimumSampleCount>1</MinimumSampleCount>
            <ExpectedValues>
            <ExpectedValue>8</ExpectedValue>
            <ExpectedValue>5</ExpectedValue>
            </ExpectedValues>
            <Actual>
                <seq>1</seq>
                <ValueFound>8</ValueFound>
                <seqTestResult>Passed</seqTestResult>
            </Actual>
            <Actual>
                <seq>3</seq>
                <ValueFound>8</ValueFound>
                <seqTestResult>Passed</seqTestResult>
            </Actual>
            <Result>Last sequence matches test cases.</Result>
            <TestResult>Passed</TestResult>
            </Test>
        <Test Name="Test 3">
            <Number>25</Number>
            <ExpectedValues><ExpectedValue>3.50</ExpectedValue>
            <ExpectedValue>3.56</ExpectedValue>
            <ExpectedValue>3.60</ExpectedValue>
            </ExpectedValues>
            <Result>not applicable</Result>
            <TestResult>Skipped</TestResult>
        </Test>
        <OverallTestResult>Passed</OverallTestResult>
    </Tests>
</Results>

SQL代码:

INSERT INTO dbo.Results_XML ([Version],[InputFilename],[Filename],
      [OverallTestResult],Name,Number,MinimumSampleCount,ActualNumberOfSamples,ExpectedValue,
       ActualSeq, ActualValueFound,ActualseqTestResult,CompareValue,Result,TestResult

    SELECT [Version] = x.data.value('Version[1]','numeric(3,2)'),
       [InputFilename] = x.data.value('InputFilename[1]','varchar(80)'),
       [Filename] = x.data.value('Filename[1]','varchar(80)'),
       [OverallTestResult]=T2.N.value('OverallTestResult[1]','varchar(15)'),
       [Test Name]= y.data.value('@Name','varchar(255)')
         ,[Number]= y.data.value('Number[1]','int'),
         [MinimumSampleCount]=y.data.value('Number[1]','int'),
         [ActualNumberOfSamples]=y.data.value('ActualNumberOfSamples[1]','int')
         ,[ExpectedValue]=z.data.value('ExpectedValue[1]','varchar(255)')
         ,[ActualSeq]=v.data.value('Seq[1]','int'),
         ,ActualValueFound=v.data.value('ValueFound[1]','int'),
         ,ActualseqTestResult=v.data.value('seqTestResult[1]','varchar(255)'),
        ,[CompareValue]=y.data.value('CompareValue[1]','bigint')
         ,[Result]=y.data.value('Result[1]','varchar(40)'),
         [TestResult]=y.data.value('TestResult[1]','varchar(10)')

    FROM CD t
       CROSS APPLY t.XMLData.nodes('/Results/General') x(data)
       cross apply t.XMLData.nodes('/Results/Tests') as T2(N)
       CROSS APPLY t.XMLData.nodes('/Results/Tests/Test') as y(data) 
       CROSS APPLY t.XMLData.nodes('Test/ExpectedValues/Expected') z(data) 
       CROSS APPLY t.XMLData.nodes('Test/ExpectedValues/Actual/') v(data)

1 个答案:

答案 0 :(得分:0)

我假设(基于您之前的问题)这是针对 SQL Server - 是否正确?
你应该总是明确并清楚地指明你正在使用的数据库系统 - 习惯它!

您需要使用以下内容:

  • 获取<Results>/<General>节点的XML节点以获取一些基本数据
  • 然后获取所有<Test>个节点的列表 - 从那里获取一些数据
  • 基于每个<Test>节点 - 获取<ExpectedValues>/<ExpectedValue>节点的列表以及<Actual>内的<Test>节点,并挑选出您需要的数据< / LI>

根据我的经验,最好使用描述性名称 - 使用GeneralDataExpectedData等,而不只是x,{{1} }和y - 这使更容易了解您正在处理的内容!

这是我使用的T-SQL / XQuery语句:

z