Jak dane z kolumny zamienić na listę? Używając FOR XML PATH(”) …

Wielokrotnie zdarzała mi się sytuacja, gdy musiałem przekazać z procedury (bądź też funkcji) string zawierający identyfikatory i poprzedzielany przecinkiem. Czasem dla potrzeb GUI jest też potrzeba przekazania stringu z określonymi etykietami z użyciem pewnego znaku, jako seperatora.

Problem wydaje się złożony. Jak dane, które mamy w jednej kolumnie ale wielu wierszach, sprowadzić do jednej zmiennej. Kursor? Rekurencja? Da się, ale raz że wymaga napisania kilku linii kodu, dwa że będzie mało wydajne.

Rozwiązaniem okazuje się użycie klauzuli FOR XML PATH(”). Dzięki użyciu tej klauzuli zamieniamy wiele wierszy w jeden, w którym mamy zbiór wartości przedzielony określonym przez nas separatorem.

Przykładowy kod:

--schemat dla potrzeb przykladu
CREATE SCHEMA mg
GO

--stworzenie tabeli z danymi testowymi
SELECT id, etykieta
  INTO mg.tabela_przykladowa
  FROM (
		SELECT 1 AS id, 'opis1' AS etykieta
		UNION
		SELECT 2 AS id, 'opis2' AS etykieta
		UNION
		SELECT 3 AS id, 'opis3' AS etykieta
		UNION
		SELECT 4 AS id, 'opis4' AS etykieta
	   ) AS temp
GO

--pobranie interesujących nas wartosci
SELECT STUFF(
			 (
			 SELECT ';'+ etykieta
			   FROM mg.tabela_przykladowa
			  WHERE id <> 3
			    FOR XML PATH('')
			 ),1,1,''
			) AS lista_etykiet,
       STUFF(
			 (
			 SELECT ','+ CAST(id AS varchar(10))
			   FROM mg.tabela_przykladowa
			  WHERE id <> 3
			  ORDER BY etykieta DESC
			    FOR XML PATH('')
			 ),1,1,''
			) AS lista_id
GO

--posprzatanie bazy
DROP TABLE mg.tabela_przykladowa
GO
DROP SCHEMA mg
GO

I wynik zapytania:

pozdrawiam,

Podziel się na:
  • Google Bookmarks
  • RSS
  • Dodaj do ulubionych
  • email
  • Facebook
  • Twitter
  • Blogger.com
  • LinkedIn
  • Gadu-Gadu Live