Die Hauptidee der SQL Server-Funktion namens STUFF besteht darin, mehrere Spalten mit mehr Flexibilität als die CONCAT-Funktion zu einer einzigen Spalte zu verketten. Außerdem kann STUFF mit anderen Techniken für einige interessante Effekte kombiniert werden.
In diesem Artikel untersuchen wir die Möglichkeiten, die der STUFF-Befehl für SQL-Datenbank-Spezialisten bietet.
Die T-SQL STUFF-Funktion
Werfen wir zunächst einen Blick auf die offizielle Microsoft-Definition der STUFF-Funktion:
Die STUFF-Funktion fügt einen String in einen anderen String ein. Es löscht eine bestimmte Länge von Zeichen in der ersten Zeichenfolge an der Startposition und fügt dann die zweite Zeichenfolge in die erste Zeichenfolge an der Startposition ein.
Wenn Sie also den STUFF-Befehl verwenden, ordnen Sie die Spaltendaten neu an.
Schauen wir uns ein paar Beispiele an.
Der erste ist die Ausgabe des STUFF-Befehls – der ursprüngliche ABCDEFG-String wird mit dem XXX-String gefüllt.
SELECT STUFF('ABCDEFG',3,3,'XXX');
Wir werden diese Ausgabe analysieren, um den STUFF-Befehl vollständig zu verstehen:
Nun wird der dritte Parameter auf Werte von 4,5,6 erhöht.
SELECT STUFF('ABCDEFG',3,4,'XXX');
SELECT STUFF('ABCDEFG',3,5,'XXX');
SELECT STUFF('ABCDEFG',3,6,'XXX');
Funktionsaufruf-Erklärungen
Die Ersetzung erfolgt bei jeder Ausführung beim dritten Zeichen der ursprünglichen ABCDEFG-Zeichenfolge. Der einzige Unterschied besteht in der Anzahl der zu löschenden Zeichen, die über den Parameter Löschlänge angegeben werden .
Also, wenn die Länge löschen Parameter von der Startposition -Parameter länger als die ursprüngliche Zeichenfolge ist, werden die Daten abgeschnitten.
Unsere ursprüngliche Zeichenfolge ist beispielsweise 7 Zeichen lang. Die STUFF-Funktion beginnt an Position 3 und läuft für 5 weitere Zeichen. Da 8 mehr als die ursprüngliche Zeichenfolgenlänge von 7 ist, wird der Wert als ABXXX.
zurückgegebenMehrfache Verwendung von STUFF in derselben Anfrage
Sie können den STUFF-Befehl in einen anderen STUFF-Befehl verschachteln und so oft wie nötig verwenden. Sie sollten jedoch berücksichtigen, wie sich dies auf die Abfragen auf Produktionsebene auswirkt. Jeder verschachtelte Aufruf wird für jede Zeile der zurückgegebenen Daten ausgeführt.
SELECT STUFF(STUFF('ABCDEFG',1,1,'1'),7,1,'7') as StuffExample5;
In diesem Beispiel wird das erste Zeichen der Originalzeichenfolge durch das Zeichen 1 und das letzte durch das Zeichen 7 ersetzt.
STUFF und ForXML
ForXML ist eine Funktion in SQL Server, die die Ergebnismengen von SQL-Abfragen in XML-formatierte Ergebnisse umwandeln kann.
STUFF kann auch mit anderen SQL Server-Funktionen wie ForXML kombiniert werden. Es hilft bei der Konsolidierung von Daten für Berichtszwecke. Nehmen wir die folgende Tabellenstruktur:
Angenommen, Sie möchten einen Bericht mit 2 Spalten. Die erste Spalte ist USER_NAME , und die zweite ist eine durch Kommas getrennte Rolle Spalte für jede Rolle, die der Benutzer innehat. Wie könnte dies in reinem T-SQL erreicht werden?
Erstellen Sie die Tabellenstruktur und fügen Sie Daten ein:
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');
Verwenden Sie den STUFF-Befehl:
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
In diesem Beispiel wird jeder USER_ID eine innere Abfrage hinzugefügt. Der STUFF-Befehl wird verwendet, um das anfängliche Komma zu ersetzen. Als Ergebnis haben wir eine schöne, durch Kommas getrennte Liste jedes Benutzers mit den entsprechenden Rollen.
Anwendungsfälle
Datenmaskierung
SQL Server bietet Lösungen für die dynamische Datenmaskierung. STUFF könnte jedoch verwendet werden, um sensible Daten zu verschleiern, wenn sie angezeigt werden. Stellen Sie sich eine Ansicht vor, die auf einer Tabelle sitzt, die Kunden-PII-Felder wie SSN enthält. Die Ansicht könnte den STUFF-Befehl verwenden, um alles außer den letzten 4 Ziffern der SSN zu maskieren.
Datenkonsolidierung
Wie bei FORXML und STUFF gezeigt, bietet T-SQL die Möglichkeit, Daten in einzelne Spalten mit einer Art primärer Kennung zu konsolidieren. In diesem Beispiel war es der USER_NAME. Diese Art der Analyse ist jedoch in der Datenbankberichtsarchitektur ziemlich verbreitet.
Zusammenfassung
Daher haben wir die Parameter des STUFF-Befehls in T-SQL behandelt und verstanden, wie dieser Befehl im Vergleich zu CONCAT abschneidet. Wir haben sowohl einfache als auch komplexe Beispiele des STUFF-Befehls demonstriert und einige Anwendungsfälle aufgelistet, für die STUFF anwendbar sein kann.
Es ist ein wertvoller Befehl, der ein großartiges Werkzeug sein kann, das man unter seinem Gürtel haben kann. Bitte kommentieren Sie andere Anwendungsfälle für den STUFF-Befehl.