สำหรับเอาต์พุต xml path ('')


9

เมื่อฉันเรียกใช้ต่อไปนี้

select t.type
  from (values ('Green'),('Blue'),('Red')) as t(type)
   for xml path('')

ฉันได้รับผลลัพธ์นี้

<type>Green</type>
<type>Blue</type>
<type>Red</type>

ถ้าฉันเรียกใช้ต่อไปนี้

select t.type + '/'
  from (values ('Green'),('Blue'),('Red')) as t(type)
   for xml path('')

ฉันได้รับผลลัพธ์นี้

Green/Blue/Red/

เหตุใดการเพิ่มการต่อข้อมูลในตัวเลือกที่นำไปสู่การลบแท็กประเภทและเอาต์พุตในหนึ่งบรรทัดในไฟล์ xml ใช้ SQL Server 2012

คำตอบ:


15

XML เป็นโบนัส

เมื่อคุณเพิ่มสตริงที่ต่อกันคุณจะสูญเสีย "องค์ประกอบของพา ธ "

ตัวอย่างเช่นถ้าคุณทำสิ่งนี้:

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML PATH('');

SELECT t.type + '/' 
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML PATH('type');

คุณได้รับสิ่งนี้กลับมา:

<type>Green/</type>
<type>Blue/</type>
<type>Red/</type>

ชื่อคอลัมน์หรือนามแฝงทำหน้าที่เป็นองค์ประกอบของเส้นทาง

ตัวอย่างอื่น ๆ ที่อาจช่วยได้

การใช้ RAW, ELEMENTS

SELECT t.type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, ELEMENTS;

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, ELEMENTS;

ในตัวอย่างแรกคุณจะได้รับชื่อองค์ประกอบ "แถว" ทั่วไป แต่ในครั้งที่สองคุณจะได้รับแถว / ประเภท

เมื่อใช้RAW, TYPE:

SELECT t.type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, TYPE;

SELECT t.type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML RAW, TYPE;

การสืบค้นแรกส่งคืน valid-ish XML ที่สองส่งข้อผิดพลาดเนื่องจากองค์ประกอบพา ธ ไม่มีตัวระบุ

การใช้AUTOชื่อแทนตารางและชื่อคอลัมน์จะเปลี่ยนเป็นพา ธ :

SELECT type + '/' AS type
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

SELECT type 
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

แต่ไม่มีนามแฝงคุณจะได้รับข้อผิดพลาดที่คล้ายกัน:

SELECT type + '/'
FROM   ( VALUES ( 'Green' ), ( 'Blue' ), ( 'Red' )) AS t ( type )
FOR XML AUTO;

ฉันจะลองเป็นตัวอย่างFOR XML EXPLICITแต่มันจะไม่รับผิดชอบสำหรับฉันที่จะเริ่มดื่มตอนนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.