sql >> Databasteknik >  >> RDS >> Database

T-SQL Stuff Kommando

Huvudidén kring SQL Server-funktionen som kallas STUFF är att sammanfoga flera kolumner till en enda kolumn med mer flexibilitet än CONCAT-funktionen skulle ge. Dessutom kan STUFF kombineras med andra tekniker för intressanta effekter.

I den här artikeln kommer vi att utforska möjligheterna som STUFF-kommandot ger SQL Database-specialister.

T-SQL STUFF-funktionen

Låt oss först ta en titt på Microsofts officiella definition av STUFF-funktionen:

STUFF-funktionen infogar en sträng i en annan sträng. Den tar bort en angiven längd av tecken i den första strängen vid startpositionen och infogar sedan den andra strängen i den första strängen vid startpositionen.

Således, när du använder kommandot STUFF, arrangerar du om kolumndata.

Låt oss ta en titt på några exempel.

Den första är utdata från kommandot STUFF – den ursprungliga ABCDEFG-strängen kommer att fyllas med XXX-strängen.

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

Vi kommer att analysera denna utdata för att helt förstå STUFF-kommandot:

Nu ökas den tredje parametern till värden 4,5,6.

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

Funktionsförklaringar

Ersättningen sker vid det tredje tecknet i den ursprungliga ABCDEFG-strängen i varje körning. Den enda skillnaden är antalet tecken som anges att radera via delete length-parametern .

Således, när raderingslängden parameter från startposition parametern är längre än den ursprungliga strängen, trunkeras data.

Till exempel är vår ursprungliga sträng 7 tecken lång. STUFF-funktionen startar vid position 3 och körs i ytterligare 5 tecken. Eftersom 8 är mer än den ursprungliga stränglängden på 7, returneras värdet som ABXXX.

Mångfaldig användning av STUFF i samma fråga

Du kan kapsla STUFF-kommandot inom ett annat STUFF-kommando och använda det så många gånger som behövs. Du bör dock överväga hur det påverkar frågorna på produktionsnivån. Varje kapslat anrop körs för varje rad med returnerad data.

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

I det här exemplet ersätts det första tecknet i den ursprungliga strängen med tecknet 1 och det sista tecknet med tecknet 7.

STUFF och ForXML

ForXML är en funktion i SQL Server som kan omvandla resultatuppsättningarna av SQL-frågor till XML-formaterade resultat.

STUFF kan också kombineras med andra SQL Server-funktioner som ForXML. Det hjälper till att konsolidera data för rapporteringsändamål. Låt oss ta följande tabellstruktur:

Anta att du vill ha en rapport med 2 kolumner. Den första kolumnen är USER_NAME , och den andra är en kommaseparerad roll kolumn för varje roll som användaren har. Hur kunde detta åstadkommas i ren T-SQL?

Bygg tabellstrukturen och infoga 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');

Använd kommandot 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 det här exemplet kopplas en inre fråga till varje USER_ID. Kommandot STUFF används för att ersätta det initiala kommatecken. Som ett resultat har vi en trevlig kommaseparerad lista över varje användare med respektive roller.

Användningsfall

Datamaskering

SQL Server tillhandahåller lösningar för dynamisk datamaskering. STUFF kan dock användas för att fördunkla känslig data när den visas. Föreställ dig en vy som sitter ovanpå ett bord som har kund-PII-fält som SSN. Vyn kan använda kommandot STUFF för att maskera allt utom de fyra sista siffrorna i SSN.

Datakonsolidering

Som visats med FORXML och STUFF erbjuder T-SQL möjligheten att konsolidera data i enstaka kolumner med någon sorts primär identifierare. I det här exemplet var det USER_NAME. Denna typ av analys är dock ganska vanlig i databasrapporteringsarkitektur.

Sammanfattning

Således täckte vi parametrarna för STUFF-kommandot i T-SQL och förstod hur detta kommando kan jämföras med CONCAT. Vi visade både enkla och komplexa exempel på STUFF-kommandot och listade några användningsfall för vilka STUFF kan användas.

Det är ett värdefullt kommando som kan vara ett bra verktyg att ha under bältet. Vänligen kommentera med andra användningsfall för STUFF-kommandot.


  1. Varför behövs UTFÖR OMEDELBART här?

  2. Lagrad procedur med valfria WHERE-parametrar

  3. Minnestryckanalys Risktillstånd

  4. Hur man beräknar marginal i MySQL