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,我很快就会回来,或者其他人。。。。