sql >> Database teknologi >  >> RDS >> Database

T-SQL Stuff Kommando

Hovedideen omkring SQL Server-funktionen kaldet STUFF er at sammenkæde flere kolonner i en enkelt kolonne med mere fleksibilitet end CONCAT-funktionen ville give. Desuden kan STUFF kombineres med andre teknikker for nogle interessante effekter.

I denne artikel vil vi udforske de muligheder, som STUFF-kommandoen giver for SQL Database-specialister.

T-SQL STUFF-funktionen

Lad os først tage et kig på den officielle Microsoft-definition af STUFF-funktionen:

STUFF-funktionen indsætter en streng i en anden streng. Den sletter en specificeret længde af tegn i den første streng ved startpositionen og indsætter derefter den anden streng i den første streng ved startpositionen.

Når du bruger STUFF-kommandoen, omarrangerer du kolonnedataene.

Lad os tage et kig på et par eksempler.

Den første er output fra STUFF-kommandoen – den originale ABCDEFG-streng vil blive fyldt med XXX-strengen.

SELECT STUFF('ABCDEFG',3,3,'XXX');

Vi analyserer dette output for fuldt ud at forstå STUFF-kommandoen:

Nu er den tredje parameter øget til værdier på 4,5,6.

SELECT STUFF('ABCDEFG',3,4,'XXX');
SELECT STUFF('ABCDEFG',3,5,'XXX');
SELECT STUFF('ABCDEFG',3,6,'XXX');

Funktionskaldsforklaringer

Udskiftningen sker ved det tredje tegn i den originale ABCDEFG-streng i hver udførelse. Den eneste forskel er antallet af tegn, der er angivet til at slette via parameteren slet længde .

Således, når slettelængden parameter fra startpositionen parameter er længere end den oprindelige streng, afkortes dataene.

For eksempel er vores originale streng 7 tegn lang. STUFF-funktionen starter ved position 3 og kører i yderligere 5 tegn. Da 8 er mere end den oprindelige strenglængde på 7, returneres værdien som ABXXX.

Multiple brug af TING i samme forespørgsel

Du kan indlejre STUFF-kommandoen i en anden STUFF-kommando og bruge den så mange gange som nødvendigt. Du bør dog overveje, hvordan det påvirker forespørgslerne på produktionsniveau. Hvert indlejret kald kører for hver række af de returnerede data.

SELECT STUFF(STUFF('ABCDEFG',1,1,'1'),7,1,'7') as StuffExample5;

I dette eksempel er det første tegn i den originale streng erstattet af 1-tegn, og det sidste er erstattet af 7-tegn.

STUFF og ForXML

ForXML er en funktion i SQL Server, der kan transformere resultatsættene af SQL-forespørgsler til XML-formaterede resultater.

STUFF kan også kombineres med andre SQL Server-funktioner som ForXML. Det hjælper med at konsolidere data til rapporteringsformål. Lad os tage følgende tabelstruktur:

Antag, at du gerne vil have en rapport med 2 kolonner. Den første kolonne er USER_NAME , og den anden er en kommasepareret rolle kolonne for hver rolle, brugeren har. Hvordan kunne dette opnås i ren T-SQL?

Byg tabelstrukturen og indsæt 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');

Brug kommandoen 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

I dette eksempel er en indre forespørgsel knyttet til hver USER_ID. STUFF-kommandoen bruges til at erstatte det indledende komma. Som et resultat har vi en flot kommasepareret liste over hver bruger med de respektive roller.

Use Cases

Datamaskering

SQL Server leverer løsninger til dynamisk datamaskering. STUFF kan dog bruges til at sløre følsomme data, når de vises. Forestil dig en visning, der sidder oven på et bord, der har kunde-PII-felter såsom SSN. Visningen kunne bruge STUFF-kommandoen til at maskere alt undtagen de sidste 4 cifre i SSN.

Datakonsolidering

Som vist med FORXML og STUFF tilbyder T-SQL muligheden for at konsolidere data i enkelte kolonner med en slags primær identifikator. I dette eksempel var det USER_NAME. Denne type analyse er dog ret almindelig i databaserapporteringsarkitektur.

Oversigt

Således dækkede vi parametrene for STUFF-kommandoen i T-SQL og forstod, hvordan denne kommando kan sammenlignes med CONCAT. Vi demonstrerede både enkle og komplekse eksempler på STUFF-kommandoen og listede nogle få brugssager, som STUFF kan anvendes til.

Det er en værdifuld kommando, som kan være et godt værktøj at have under bæltet. Kommenter venligst med andre use cases for STUFF-kommandoen.


  1. Hvordan fjerner man vognretur og nye linjer i Postgresql?

  2. SSMS version 18 – ingen databasediagrammer

  3. Hvordan gemmer man flere muligheder i en enkelt tabel?

  4. SQL Server-svarende til WM_CONCAT-funktionen