Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL XML根据行数生成多个容器_Sql_Xml_Tsql - Fatal编程技术网

SQL XML根据行数生成多个容器

SQL XML根据行数生成多个容器,sql,xml,tsql,Sql,Xml,Tsql,这有点难以解释……但我会尽力 If @RecordingCount = 2 (SELECT (Select REC1.Recording_Location as MainRecordingRef FOR XML PATH('MainRecordingRef'), TYPE), (Select REC1.Recording_Location

这有点难以解释……但我会尽力

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
我有一个SQLXML导出,它工作得非常好,但是我需要添加一个额外的字段来记录wav文件的位置。如果只有一个wav位置,这不会是一个问题,但是可能有一个或多个wav位置需要记录

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
在extract SQL中,我想做一些类似于If语句或Case的事情,当只有一个文件位置时,我在XML文件中只有一个XML容器文件位置,如果有两个-我有两个,等等。我基本上不想要空容器。有人知道这是否可能吗

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
我附上了一个代码示例,希望能让您了解我的要求

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
选择-协议- “一些文本”作为附加信息

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
对于XML路径“协议”,键入

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
上面的代码不起作用,但我想知道是否有一种不同的方法,我可能需要采取。如有任何建议,将不胜感激

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
编辑

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
这是我当前输出的内容

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
协议书 协议参考PP20170510-122300协议参考 主记录参考 主记录参考 RecRef LOGOS-PP20170510-122300-9174.wav/RecRef /主记录参考 主记录参考 RecRef LOGOS-PP20170510-122400-9175.wav/RecRef /主记录参考 主记录参考 主记录参考 主记录参考 主记录参考 协定

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
在上面的例子中,我导出了五个记录引用,其中两个有一些内容,另外三个是空的,但是我只想导出那些不是空的记录引用,所以看起来像

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
协议书 协议参考PP20170510-122300协议参考 主记录参考 主记录参考 RecRef LOGOS-PP20170510-122300-9174.wav/RecRef /主记录参考 主记录参考 RecRef LOGOS-PP20170510-122400-9175.wav/RecRef /主记录参考 主记录参考 协定

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

在XML中,我能做些什么来只显示不为null的记录引用吗?

您的问题不太清楚示例数据+预期输出最有帮助。但我的神奇水晶球告诉我,您希望将一个Wav放入XML中,并将更多Wav(如果有的话)放入另一个节点集合中

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
像这样的

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
DECLARE @mockup1 TABLE(ID INT,SomeData VARCHAR(100));
INSERT INTO @mockup1 VALUES (1,'Some 1 has 1 WAV')
                           ,(2,'Some 2 has 2 WAVs')
                           ,(3,'Some 3 has 3 WAVs');
DECLARE @mockup2 TABLE(ID INT,ID1 INT,WavUrl VARCHAR(100));
INSERT INTO @mockup2 VALUES(1,1,'URL 1')
                          ,(2,2,'URL 2-1')
                          ,(3,2,'URL 2-2')
                          ,(4,3,'URL 3-1')
                          ,(5,3,'URL 3-2')
                          ,(6,3,'URL 3-3');

SELECT m1.ID
      ,m1.SomeData
      --The first Wav goes in one extra node
      ,(SELECT w.ID
              ,w.WavUrl
        FROM @mockup2 AS w 
        WHERE w.ID1=m1.ID AND w.ID=(SELECT MIN(x.ID) FROM @mockup2 AS x WHERE x.ID1=m1.ID)
        FOR XML PATH('MainRecord'),TYPE
       )
      --All later Wavs go into a collection
      ,(SELECT w2.ID
              ,w2.WavUrl
        FROM @mockup2 AS w2
        WHERE w2.ID1=m1.ID AND w2.ID<>(SELECT MIN(x.ID) FROM @mockup2 AS x WHERE x.ID1=m1.ID)
        FOR XML PATH('Record'),ROOT('MoreRecords'),TYPE
        )
FROM @mockup1 AS m1
FOR XML PATH('Test'),ROOT('root');
结果

If @RecordingCount = 2  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End

If @RecordingCount = 3  
    (SELECT 
            (Select 
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
            (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE),
                (Select
                REC1.Recording_Location as MainRecordingRef
                FOR XML PATH('MainRecordingRef'), TYPE)
        FOR XML PATH('MainRecordingRefs'), TYPE),
End
<root>
  <Test>
    <ID>1</ID>
    <SomeData>Some 1 has 1 WAV</SomeData>
    <MainRecord>
      <ID>1</ID>
      <WavUrl>URL 1</WavUrl>
    </MainRecord>
  </Test>
  <Test>
    <ID>2</ID>
    <SomeData>Some 2 has 2 WAVs</SomeData>
    <MainRecord>
      <ID>2</ID>
      <WavUrl>URL 2-1</WavUrl>
    </MainRecord>
    <MoreRecords>
      <Record>
        <ID>3</ID>
        <WavUrl>URL 2-2</WavUrl>
      </Record>
    </MoreRecords>
  </Test>
  <Test>
    <ID>3</ID>
    <SomeData>Some 3 has 3 WAVs</SomeData>
    <MainRecord>
      <ID>4</ID>
      <WavUrl>URL 3-1</WavUrl>
    </MainRecord>
    <MoreRecords>
      <Record>
        <ID>5</ID>
        <WavUrl>URL 3-2</WavUrl>
      </Record>
      <Record>
        <ID>6</ID>
        <WavUrl>URL 3-3</WavUrl>
      </Record>
    </MoreRecords>
  </Test>
</root>

你能发布一些示例数据和你期望的XML输出吗?嗨,Dave,我不清楚。。。看看我的答案。在第一行中,您将看到一个如何使用数据创建一些模型表的示例。试着为你的真实结构这样做。使用“编辑”选项将其放入问题中。显示您希望从提供的数据中获得的预期输出。然后在评论中加上@Shnugo,我很快就会回来,或者其他人。。。。