Hlavní myšlenkou funkce SQL Server s názvem STUFF je zřetězení více sloupců do jednoho sloupce s větší flexibilitou, než by poskytla funkce CONCAT. Kromě toho lze STUFF kombinovat s jinými technikami pro některé zajímavé efekty.
V tomto článku prozkoumáme možnosti, které příkaz STUFF poskytuje specialistům na databáze SQL.
Funkce T-SQL STUFF
Nejprve se podívejme na oficiální definici funkce STUFF od společnosti Microsoft:
Funkce STUFF vloží řetězec do jiného řetězce. Vymaže zadanou délku znaků v prvním řetězci na počáteční pozici a poté vloží druhý řetězec do prvního řetězce na počáteční pozici.
Když tedy používáte příkaz STUFF, měníte uspořádání dat sloupce.
Podívejme se na několik příkladů.
První je výstup příkazu STUFF – původní řetězec ABCDEFG bude naplněn řetězcem XXX.
SELECT STUFF('ABCDEFG',3,3,'XXX');
Tento výstup analyzujeme, abychom plně porozuměli příkazu STUFF:
Nyní je třetí parametr zvýšen na hodnoty 4,5,6.
SELECT STUFF('ABCDEFG',3,4,'XXX');
SELECT STUFF('ABCDEFG',3,5,'XXX');
SELECT STUFF('ABCDEFG',3,6,'XXX');
Vysvětlení volání funkcí
K nahrazení dojde u třetího znaku původního řetězce ABCDEFG při každém spuštění. Jediný rozdíl je v počtu znaků určených k odstranění pomocí parametru délky smazání .
Když tedy délka smazání parametr z počáteční pozice je delší než původní řetězec, data jsou zkrácena.
Například náš původní řetězec je dlouhý 7 znaků. Funkce STUFF začíná na pozici 3 a běží pro dalších 5 znaků. Protože 8 je větší než původní délka řetězce 7, je hodnota vrácena jako ABXXX.
Vícenásobné použití STUFF ve stejném dotazu
Příkaz STUFF můžete vnořit do jiného příkazu STUFF a použít jej tolikrát, kolikrát je potřeba. Měli byste však zvážit, jak to ovlivňuje dotazy na úrovni produkce. Každé vnořené volání běží pro každý řádek vrácených dat.
SELECT STUFF(STUFF('ABCDEFG',1,1,'1'),7,1,'7') as StuffExample5;
V tomto příkladu je první znak původního řetězce nahrazen znakem 1 a poslední znakem 7.
STUFF a ForXML
ForXML je funkce v SQL Server, která dokáže transformovat sady výsledků dotazů SQL na výsledky ve formátu XML.
STUFF lze také kombinovat s dalšími funkcemi SQL Serveru, jako je ForXML. Pomáhá konsolidovat data pro účely výkaznictví. Vezměme si následující strukturu tabulky:
Předpokládejme, že chcete přehled se 2 sloupci. První sloupec je USER_NAME a druhá je role oddělená čárkami sloupec pro každou roli, kterou uživatel zastává. Jak by toho bylo možné dosáhnout v čistém T-SQL?
Sestavte strukturu tabulky a vložte data:
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');
Použijte příkaz STUFF:
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
V tomto příkladu je vnitřní dotaz připojen ke každému USER_ID. Příkaz STUFF se používá k nahrazení počáteční čárky. Výsledkem je pěkný seznam každého uživatele s příslušnými rolemi oddělený čárkou.
Případy použití
Maskování dat
SQL Server poskytuje řešení pro dynamické maskování dat. STUFF však lze použít k zamlžení citlivých dat při jejich zobrazení. Představte si pohled sedící na stole, který obsahuje pole PII zákazníka, jako je SSN. Zobrazení může použít příkaz STUFF k maskování všeho kromě posledních 4 číslic SSN.
Konsolidace dat
Jak bylo ukázáno u FORXML a STUFF, T-SQL nabízí možnost konsolidace dat do jednotlivých sloupců s nějakým primárním identifikátorem. V tomto příkladu to bylo USER_NAME. Tento typ analýzy je však v architektuře sestavování databází docela běžný.
Shrnutí
Pokryli jsme tedy parametry příkazu STUFF v T-SQL a pochopili, jak je tento příkaz ve srovnání s příkazem CONCAT. Ukázali jsme jednoduché i složité příklady příkazu STUFF a uvedli jsme několik případů použití, pro které lze STUFF použít.
Je to cenný příkaz, který může být skvělým nástrojem, který můžete mít pod opaskem. Prosím, okomentujte další případy použití příkazu STUFF.