Główną ideą związaną z funkcją SQL Server o nazwie STUFF jest łączenie wielu kolumn w jedną kolumnę z większą elastycznością niż zapewniałaby funkcja CONCAT. Poza tym STUFF można łączyć z innymi technikami, aby uzyskać ciekawe efekty.
W tym artykule przyjrzymy się możliwościom, jakie polecenie STUFF zapewnia specjalistom SQL Database.
Funkcja T-SQL STUFF
Przyjrzyjmy się najpierw oficjalnej definicji funkcji STUFF firmy Microsoft:
Funkcja STUFF wstawia ciąg do innego ciągu. Usuwa określoną długość znaków z pierwszego ciągu w pozycji początkowej, a następnie wstawia drugi ciąg do pierwszego ciągu w pozycji początkowej.
Tak więc, kiedy używasz polecenia STUFF, zmieniasz kolejność danych w kolumnie.
Rzućmy okiem na kilka przykładów.
Pierwszym z nich jest wynik polecenia STUFF – oryginalny ciąg ABCDEFG zostanie wypełniony ciągiem XXX.
SELECT STUFF('ABCDEFG',3,3,'XXX');
Przeanalizujemy ten wynik, aby w pełni zrozumieć polecenie STUFF:
Teraz trzeci parametr został zwiększony do wartości 4,5,6.
SELECT STUFF('ABCDEFG',3,4,'XXX');
SELECT STUFF('ABCDEFG',3,5,'XXX');
SELECT STUFF('ABCDEFG',3,6,'XXX');
Objaśnienia wywołań funkcji
Zastąpienie następuje przy trzecim znaku oryginalnego ciągu ABCDEFG w każdym wykonaniu. Jedyną różnicą jest liczba znaków do usunięcia za pomocą parametru długości usuwania .
Tak więc, gdy usuń długość parametr z pozycji początkowej parametr jest dłuższy niż oryginalny ciąg, dane są obcinane.
Na przykład nasz oryginalny ciąg ma 7 znaków. Funkcja STUFF zaczyna się od pozycji 3 i działa dla kolejnych 5 znaków. Ponieważ 8 to więcej niż oryginalna długość ciągu 7, wartość jest zwracana jako ABXXX.
Wielokrotne użycie STUFF w tym samym zapytaniu
Możesz zagnieździć polecenie STUFF w innym poleceniu STUFF i używać go tyle razy, ile potrzeba. Należy jednak zastanowić się, jak wpływa to na zapytania na poziomie produkcji. Każde zagnieżdżone wywołanie działa dla każdego wiersza zwróconych danych.
SELECT STUFF(STUFF('ABCDEFG',1,1,'1'),7,1,'7') as StuffExample5;
W tym przykładzie pierwszy znak oryginalnego ciągu jest zastępowany 1 znakiem, a ostatni 7 znakiem.
STUFF i ForXML
ForXML to funkcja SQL Server, która może przekształcić zestawy wyników zapytań SQL w wyniki w formacie XML.
STUFF można również łączyć z innymi funkcjami SQL Server, takimi jak ForXML. Pomaga skonsolidować dane do celów raportowania. Przyjmijmy następującą strukturę tabeli:
Załóżmy, że chcesz otrzymać raport z 2 kolumnami. Pierwsza kolumna to USER_NAME , a drugi to oddzielona przecinkami rola kolumna dla każdej roli pełnionej przez użytkownika. Jak można to osiągnąć w czystym T-SQL?
Zbuduj strukturę tabeli i wstaw dane:
CREATE TABLE
#USER
(
USER_ID INT,
USER_NAME VARCHAR(50)
)
CREATE TABLE
#USER_ROLES
(
USER_ID INT,
ROLE VARCHAR(50)
)
INSERT INTO #USER VALUES(1,'Edward')
INSERT INTO #USER VALUES(2,'John')
INSERT INTO #USER VALUES(3,'Mark')
INSERT INTO #USER_ROLES VALUES(1,'Admin')
INSERT INTO #USER_ROLES VALUES(1,'Writer')
INSERT INTO #USER_ROLES VALUES(1,'Form')
INSERT INTO #USER_ROLES VALUES(2,'Writer')
INSERT INTO #USER_ROLES VALUES(3,'Form')
INSERT INTO #USER_ROLES VALUES(3,'Writer');
Użyj polecenia RZECZY:
SELECT
U.USER_NAME,
STUFF((SELECT ',' + UR.ROLE
FROM #USER_ROLES UR
WHERE UR.USER_ID = U.USER_ID
FOR XML PATH('')), 1, 1, '') [ROLES]
FROM #USER U
GROUP BY U.USER_NAME, U.USER_ID
ORDER BY 1
W tym przykładzie z każdym identyfikatorem USER_ID jest połączone zapytanie wewnętrzne. Polecenie STUFF służy do zastąpienia początkowego przecinka. W rezultacie mamy ładną listę oddzieloną przecinkami każdego użytkownika z odpowiednimi rolami.
Przypadki użycia
Maskowanie danych
SQL Server zapewnia rozwiązania do dynamicznego maskowania danych. Jednak STUFF może służyć do zaciemniania poufnych danych podczas ich wyświetlania. Wyobraź sobie widok siedzący na szczycie stołu z polami umożliwiającymi identyfikację klienta, takimi jak SSN. Widok może użyć polecenia STUFF do zamaskowania wszystkiego z wyjątkiem ostatnich 4 cyfr numeru SSN.
Konsolidacja danych
Jak pokazano w przypadku FORXML i STUFF, T-SQL oferuje możliwość konsolidacji danych w pojedyncze kolumny z pewnym rodzajem podstawowego identyfikatora. W tym przykładzie był to USER_NAME. Jednak ten rodzaj analizy jest dość powszechny w architekturze raportowania bazy danych.
Podsumowanie
W ten sposób omówiliśmy parametry polecenia STUFF w T-SQL i zrozumieliśmy, jak to polecenie ma się do CONCAT. Zademonstrowaliśmy zarówno proste, jak i złożone przykłady polecenia STUFF i wymieniliśmy kilka przypadków użycia, dla których STUFF może mieć zastosowanie.
To cenne polecenie, które może być świetnym narzędziem, które warto mieć pod ręką. Proszę o komentarz z innymi przypadkami użycia polecenia STUFF.