Rabu, 21 April 2010

Menggabungkan isi field menjadi satu String di MS SQL 2005

Ketika kita membutuhkan data dari isi kolom menjadi satu string. Kita bisa menggunakan sintak for xml.
Contohnya saya akan menggabungkan isi dari field name pada sys.databases :
SELECT name
FROM   sys.databases
WHERE  database_id > 4 
Name
Temp
Liquibase
NorthWind
EMPLOYEES


Dengan query berikut kita bisa menggabungkan nama tersebut :
SELECT Stuff((SELECT ', ' + name
              
FROM   sys.databases
              
WHERE  database_id > 4
              
ORDER  BY name
              
FOR XML PATH('')), 1, 2, '') AS namelist; 

Namelist
EMPLOYEES, Liquibase, NorthWind, Temp


Bagaimana jika kita ingin menambahkan tanda kurung siku pada setiap nama seperti berikut: <EMPLOYEES>, <Liquibase>, <NorthWind>, <Temp>

Jika kita menggunakan syntax seperti diatas :

SELECT Stuff((SELECT ', <' + name + '>'
              
FROM   sys.databases
              
WHERE  database_id > 4
              
ORDER  BY name
              
FOR XML PATH('')), 1, 2, '') AS namelist; 

Hasilnya tanda < dan > muncul menjadi &lt dan &gt :

namelist
&lt;EMPLOYEES&gt;, &lt;Liquibase&gt;, &lt;NorthWind&gt;, &lt;Temp&gt;


Untuk mengatasi itu, kita bisa menambahkan sedikit syntak forxml nya. Berikut querynya :

SELECT
STUFF(
(SELECT ', <' + name + '>'
FROM sys.databases
WHERE database_id > 4
ORDER BY name
FOR XML PATH(''), root('MyString'), TYPE
).value('/MyString[1]','varchar(max)')
, 1, 2, '') AS namelist;

atau

SELECT
STUFF(
(SELECT ', <' + name + '>'
FROM sys.databases
WHERE database_id > 4
ORDER BY name
FOR XML PATH(''), TYPE
).value('(./text())[1]','varchar(max)')
, 1, 2, '') AS namelist

Hasilnya :

namelist
<EMPLOYEES>, <Liquibase>, <NorthWind>, <Temp>

Tidak ada komentar:

Posting Komentar