Database
 sql >> Datenbank >  >> RDS >> Database

Verkettung in Transact-SQL

Einführung

Angenommen, Sie pflegen eine Tabelle mit Kundendaten und Ihr Chef bittet Sie, ihm die aktuelle Kundenliste und deren Telefonnummern zuzusenden. Normalerweise extrahieren Sie die Daten und senden ihm eine Tabelle mit Zeilen und Spalten. Sie könnten sich auch dafür entscheiden, ein bisschen eleganter zu sein und ihm die erforderlichen Informationen in einem menschenfreundlicheren Format zu senden. SQL Server bietet Funktionen, mit denen wir dies erreichen können, indem wir englische Ausdrücke mit Daten in Tabellen kombinieren, um eine Ausgabe zu präsentieren, die für Laien leichter lesbar ist. Diese Funktionen können auch subtiler eingesetzt werden.

Die CONCAT-Funktion

Die CONCAT-Funktion akzeptiert zwei oder mehr String-Argumente und gibt die Kombination solcher Strings als einen einzigen Ausdruck zurück. Dies kann nützlich sein, wenn Sie den Inhalt verschiedener Spalten als einen einzigen Ausdruck anzeigen möchten. Ein einfaches Beispiel für die Verwendung dieser Funktion ist in Listing 1 dargestellt.

-- Listing 1:Einfaches CONCAT-Statementselect CONCAT('This','Function','joins','strings.') as statement1;select CONCAT('This','Function','joins','strings .') als Anweisung2;Wählen Sie CONCAT('This',' ','Function',' ','joins',' ','strings') als Anweisung

Beachten Sie die Variationen dieser Aussage unter Verwendung des Leerzeichens und der Ergebnisse in Abb. 1.

Abb. 1. Einfache CONCAT-Anweisung

Wenn wir versuchen, die CONCAT-Anweisung mit einem Eingabewert vom Datentyp INT zu verwenden, führt SQL Server eine implizite Konvertierung durch und gibt dennoch eine Zeichenfolgenausgabe zurück, wie in Abb. 2 gezeigt. Wir können bestätigen, dass dies tatsächlich passiert, indem wir tief in die Einzelheiten der Anweisung in Listing 2. Schauen Sie sich zunächst die Struktur der Tabelle an, die uns interessiert. Abb. 2 zeigt uns, dass die PhoneNumber# und FirstTranDate Spalten sind BIGINT- bzw. DATETIME-Spalten.

Abb. 2. Aufbau der Kundentabelle

-- Listing 2:Implizite Konvertierung Bei Verwendung von CONCAT (BIGINT)USE EXAMGOSELECT CONCAT(firstname, ' ',lastname, '''s ', 'Phone number is ',phonenumber1) FROM CUSTOMER;

Ein kurzer Blick auf den Ausführungsplan zeigt uns, dass SQL Server eine implizite Konvertierung durchführt in der Spalte PhoneNumber1. Dies ist dasselbe, wenn die Spalte den Datumsdatentyp hat, wie in Listing 4 und Abb. 4 gezeigt. Die CONCAT-Funktion führt eine implizite Konvertierung basierend auf den Regeln durch, die in dem Diagramm in Abb. 6 dargestellt sind.

Abb. 3. Implizite Konvertierung des Datentyps BIGINT in VARCHAR

-- Listing 3:Implizite Konvertierung Bei Verwendung von CONCAT (DATETIME)USE EXAMGOSELECT FirstTranDate, CONCAT(FirstName, ' ',LastName, '''s ', 'first transaction date is ',FirstTranDate) as STMTFROM CUSTOMER; 

Abb. 4. Implizite Konvertierung von DATETIME-Datentyp in VARCHAR

Abb. 5. Implizite Konvertierung des BIGINT-Datentyps in VARCHAR

Abb. 6. Datentypkonvertierung in SQL Server

Der primäre Anwendungsfall für diese Funktion kann aus den obigen Demonstrationen abgeleitet werden. Ein Beispiel wäre ein Fall, in dem einige Informationen auf einem Dashboard oder einer Webseite in einer freundlicheren Sprache angezeigt werden müssen, wobei Daten aus einer Reihe von Spalten oder sogar separaten Tabellen verwendet werden.

Die CONCAT_WS-Funktion

Die Funktion CONCAT_WS ist eine Erweiterung der Funktion CONCAT. Es ermöglicht uns, als ersten Parameter ein gewünschtes Trennzeichen anzugeben. Listing 4 zeigt uns eine Modifikation einer der Anweisungen, die wir zuvor in Listing 1 verwendet haben.

--Listing 4 mit CONCAT_WSSELECT CONCAT('This',' ','Function',' ','joins',' ','strings') AS statement;SELECT CONCAT('This',' ',' Funktion',' ','joins',' ','strings') AS-Anweisung;SELECT CONCAT_WS(' ','This','Function','joins','strings') AS-Anweisung;

Beachten Sie, dass CONCAT_WS es einfacher macht, eine Anweisung mit einem Leerzeichen als Trennzeichen zu erstellen, als ein Leerzeichen als Argument nach jedem Argument einzufügen.

--Listing 5 Verwendung von CONCAT_WS mit SpaltenUSE EXAMGOSELECT CONCAT(firstname, ' ',lastname, '''s ', 'Phone number is ',phonenumber1) FROM CUSTOMER;USE EXAMGOSELECT CONCAT_WS(' ',firstname,lastname, ' ''s ', 'Telefonnummer ist',Telefonnummer1) VOM KUNDEN;

Verkettung mit dem „+“-Zeichen

SQL Server unterstützt die Verwendung des „+“-Zeichens, um die Funktion der CONCAT-Funktion auf viel einfachere Weise zu erreichen. Dieser Ansatz wird normalerweise zum Generieren von T-SQL-Anweisungen verwendet, wenn Sie Vorgänge für eine große Anzahl von Objekten ausführen müssen. Listing 7 zeigt, wie wir einen Statistikaktualisierungsbatch für alle Tabellen in der Prüfungsdatenbank generieren können.

-- Listing 6:Generieren von Update-Statistik-AnweisungenUSE ExamGOSELECT 'UPDATE STATISTICS ' + name + ' WITH SAMPLE 25 PERCENT;' als STMT aus sys.tables;SELECT 'STATISTIK AKTUALISIEREN [' + name + '] MIT PROBE 25 PROZENT;' als STMT von sys.tables;GO

Beachten Sie die eckigen Klammern in der zweiten Anweisung. Es ist nützlich, wenn es um ein Systemobjekt mit Leerzeichen oder Sonderzeichen geht.

-- Listing 7 Erzeugen von Create User StatementsUSE MASTERGOSELECT 'CREATE USER [' + LOGINNAME + '] FOR LOGIN [' + LOGINNAME + '];' AS STMT FROM SYSLOGINSWHERE LOGINNAME NOT LIKE '#%';GOUSE EXAMGOCREATE USER [sa] FOR LOGIN [sa];ERSTELLE BENUTZER [EPG-KIGIRI\ekocauris] FÜR LOGIN [EPG-KIGIRI\ekocauris];ERSTELLE BENUTZER [KAIROSAFRIKA\kigiri] FÜR ANMELDUNG [KAIROSAFRIKA\kigiri];BENUTZER ERSTELLEN [NT SERVICE\SQLWriter] FÜR LOGIN [NT SERVICE\SQLWriter];BENUTZER ERSTELLEN [NT SERVICE\Winmgmt] FÜR LOGIN [NT SERVICE\Winmgmt];BENUTZER ERSTELLEN [NT Service\MSSQL$ I2019] FÜR LOGIN [NT-Dienst\MSSQL$I2019];BENUTZER ERSTELLEN [NT-AUTORITÄT\SYSTEM] FÜR LOGIN [NT-AUTORITÄT\SYSTEM];BENUTZER ERSTELLEN [NT-SERVICE\SQLAgent$I2019] FÜR LOGIN [NT-SERVICE\SQLAgent$I2019];BENUTZER ERSTELLEN [NT SERVICE\SQLTELEMETRY$I2019] FÜR LOGIN [NT SERVICE\SQLTELEMETRY$I2019];BENUTZER ERSTELLEN [KAIROSAFRIKA\sberko] FÜR LOGIN [KAIROSAFRIKA\sberko];GO

Sobald die Ausgabe generiert ist, kann sie verwendet werden, um Benutzer in jeder gewünschten Datenbank zu erstellen, wie in Listing 7 gezeigt. Beachten Sie, dass wir einen Filter für die Anmeldenamen hinzugefügt haben, an denen wir interessiert sind. Dieser Ansatz kann verwendet werden, um alle Arten von Anweisungen zu generieren und rufen Sie solche Anweisungen innerhalb derselben Sitzung auf. Ein komplexeres Beispiel sind die folgenden Anweisungen, die alle Indizes in jeder Datenbank kreativ neu erstellen. (Siehe Listen 8 und 9).

--Listing 8:Generieren von Index-WiederherstellungsanweisungenUSE EXAMGOCREATE TABLE #INDTAB (ID SMALLINT IDENTITY(1,1), REBUILDSTMT NVARCHAR(600))INSERT INTO #INDTAB SELECT 'SET QUOTED_IDENTIFIER ON;ALTER INDEX [' + B.NAME + '] ON [' + SCHEMA_NAME(C.SCHEMA_ID) + '].[' + OBJECT_NAME(A.OBJECT_ID) + '] REBUILD WITH (ONLINE =OFF,FILLFACTOR=80,SORT_IN_TEMPDB=ON,PAD_INDEX =ON, STATISTICS_NORECOMPUTE =OFF );'--INTO #INDTABFROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(), NULL, NULL, NULL, NULL) AS A JOIN SYS.INDEXES AS B JOIN SYS.OBJECTS AS CON B.OBJECT_ID =C.OBJECT_IDON A.OBJECT_ID =B .OBJECT_ID AND A.INDEX_ID =B.INDEX_ID WHERE AVG_FRAGMENTATION_IN_PERCENT> 30;SELECT * FROM #INDTAB;GODROP TABLE #INDTAB;GO--Listing 9 Generieren und Ausführen von IndexneuaufbauanweisungenUSE EXAMGOCREATE TABLE #INDTAB (ID SMALLINT IDENTITY(1,1) , REBUILDSTMT NVARCHAR(600))INSERT INTO #INDTAB SELECT 'SET QUOTED_IDENTIFIER ON;ALTER INDEX [' + B.NAME + '] ON [' + SCHEMA_NAME(C.SCHEMA_ID) + '].[' + OBJECT_NAME(A.OBJECT _ID) + '] REBUILD WITH (ONLINE =OFF,FILLFACTOR=80,SORT_IN_TEMPDB=ON,PAD_INDEX =ON, STATISTICS_NORECOMPUTE =OFF);'--INTO #INDTABFROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(), NULL, NULL, NULL, NULL ) AS A JOIN SYS.INDEXES AS B JOIN SYS.OBJECTS AS CON B.OBJECT_ID =C.OBJECT_IDON A.OBJECT_ID =B.OBJECT_ID AND A.INDEX_ID =B.INDEX_ID WHERE AVG_FRAGMENTATION_IN_PERCENT> 30;GODECLARE @SQL NVARCHAR(4000); SELECT @SQL=REBUILDSTMT FROM #INDTAB;PRINT @SQLEXEC SP_EXECUTESQL @SQL;GODROP TABLE #INDTAB;GO

Die Abfrage in Listing 10 zeigt, wie wir Strings mit explizit in Strings konvertierten Daten kombinieren können. Die String-Verkettung wird verwendet, um eine gemeinsame Sicherungspfadvariable zu generieren, die später in der SP_MSFOREACHDB-Funktion verwendet wird.

--Listing 10 Generieren eines gemeinsamen SicherungspfadsEXEC SP_MSFOREACHDB @COMMAND1='DECLARE @BACKUP SYSNAMESET @BACKUP=N''G:\BACKUP\?''+CONVERT(NVARCHAR,GETDATE(),112)+N'' .BAK''USE [?]IF ''?'' NOT IN ("MODEL","TEMPDB")BEGINBACKUP DATABASE ? TO DISK =@BACKUP WITH INIT , NOUNLOAD , COMPRESSION,NAME =N''?'', NOSKIP , NOFORMATEND'

Schlussfolgerung

In diesem Artikel haben wir einige Möglichkeiten zur Verwendung der Verkettung in SQL Server gezeigt. Wir haben Beispiele für die CONCAT-Funktion, die CONCAT_WS-Funktion und die Verwendung des „+“-Zeichens gegeben. Alle drei Methoden können sehr nützlich sein, um Aussagen zu generieren, indem Werte aus verschiedenen Spalten kombiniert werden, oder um Informationen einfach in einem gewünschten benutzerfreundlichen Format anzuzeigen. Die Microsoft-Dokumentation enthält weitere Informationen über die Syntax und die Fähigkeiten dieser Funktionen.

Referenzen

Umwandlung und Konvertierung (Transact-SQL)

Wenden Sie sich an Transact-SQL

Concat_ws Transact-SQL

Zeichenfolgenverkettung