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

Sammenkædning i Transact-SQL

Introduktion

Forudsat at du vedligeholder en tabel, der indeholder kundedata, og din chef beder dig sende ham den aktuelle liste over kunder og deres telefonnumre. Du ville typisk udtrække dataene og sende ham et regneark med rækker og kolonner. Du kan også beslutte dig for at være lidt stilfuld og sende ham de nødvendige oplysninger i et mere menneskevenligt format. SQL Server leverer funktioner, der giver os mulighed for at opnå dette ved at kombinere engelske udtryk med data i tabeller for at præsentere et output, der er lettere for ikke-tekniske mennesker at læse. Disse funktioner kan også bruges til mere subtile formål.

CONCAT-funktionen

CONCAT-funktionen accepterer to eller flere strengargumenter og returnerer kombinationen af ​​sådanne strenge som et enkelt udtryk. Dette kan være nyttigt, hvis du ønsker at vise indholdet af forskellige kolonner som et enkelt udtryk. Et simpelt eksempel på brug af denne funktion er vist i liste 1.

-- Liste 1:Simple CONCAT Statementsvælg CONCAT('This','Function','joins','strings.') as statement1;vælg CONCAT('Denne ','Function','joins','strenge .') som statement2;vælg CONCAT('This',' ','Function',' ','joins',' ','strings') som statement

Læg mærke til variationerne af denne sætning ved at bruge mellemrummet og resultaterne i fig. 1.

Fig. 1. Enkel CONCAT-erklæring

Hvis vi forsøger at bruge CONCAT-sætningen med en inputværdi af INT-datatypen, udfører SQL Server en implicit konvertering og returnerer stadig et strengoutput som vist i Fig. 2. Vi kan bekræfte, at det er det, der rent faktisk sker, ved at grave dybt ned i detaljer om udsagnet i liste 2. Først og fremmest skal du tage et kig på strukturen af ​​den tabel, vi er interesserede i. Fig. 2 viser os, at Telefonnummer# og FirstTranDate kolonner er henholdsvis BIGINT og DATETIME kolonner.

Fig. 2. Kundetabellens struktur

-- Liste 2:Implicit konvertering ved brug af CONCAT (BIGINT)USE EXAMGOSELECT CONCAT(fornavn, ' ',efternavn, ''s ', 'Telefonnummer er ',telefonnummer1) FRA KUNDE;

Et hurtigt kig på udførelsesplanen viser os, at SQL Server udfører en implicit konvertering i kolonnen Telefonnummer1. Dette vil være det samme, hvis kolonnen var datodatatypen som vist i liste 4 og fig. 4. CONCAT-funktionen udfører implicit konvertering baseret på reglerne skitseret i diagrammet vist i fig. 6.

Fig. 3. Implicit konvertering af BIGINT-datatypen til VARCHAR

-- Liste 3:Implicit konvertering Når du bruger CONCAT (DATETIME)USE EXAMGOSELECT FirstTranDate, CONCAT(FirstName, ' ',Efternavn, '''s ', 'første transaktionsdato er ',FirstTranDate) som STMTFROM KUNDE; 

Fig. 4. Implicit konvertering af DATETIME datatype til VARCHAR

Fig. 5. Implicit konvertering af BIGINT-datatypen til VARCHAR

Fig. 6. Datatypekonvertering i SQL Server

Den primære brugssituation for denne funktion kan udledes af demonstrationerne ovenfor. Et eksempel kunne være et tilfælde, hvor nogle oplysninger skal vises på et dashboard eller en webside i et mere venligt sprog ved hjælp af data fra et antal kolonner eller endda separate tabeller.

CONCAT_WS-funktionen

CONCAT_WS-funktionen er en udvidelse af CONCAT-funktionen. Det giver os mulighed for at angive en ønsket separator som den første parameter. Liste 4 viser os en modifikation af et af de udsagn, vi tidligere brugte i liste 1.

--List 4 Brug af CONCAT_WSSELECT CONCAT('This',' ','Function',' ','joins',' ','strings') AS-sætning;SELECT CONCAT('This',' ',' Function',' ','joins',' ','strings') AS-sætning;SELECT CONCAT_WS(' ','This','Function','joins','strings') AS-sætning;

Bemærk, at CONCAT_WS gør det lettere at konstruere et udsagn med mellemrum som separator sammenlignet med at indføre et mellemrum som et argument efter hvert argument.

--List 5 Brug af CONCAT_WS med kolonnerUSE EXAMGOSELECT CONCAT(fornavn, ' ',efternavn, '''s ', 'Telefonnummer er ',telefonnummer1) FRA KUNDE;BRUG EXAMGOSELECT CONCAT_WS(' ',fornavn,efternavn, ' ''s ', 'Telefonnummer er',telefonnummer1) FRA KUNDE;

Sammenkædning med "+"-tegnet

SQL Server understøtter brugen af ​​"+" tegnet for at opnå, hvad CONCAT-funktionen gør på en meget enklere måde. Denne tilgang bruges typisk til at generere T-SQL-sætninger, når du skal udføre operationer på et stort antal objekter. Liste 7 viser, hvordan vi kan generere en statistikopdateringsbatch for alle tabeller i eksamensdatabasen.

-- Liste 6 Generering af opdateringsstatistik-udsagn BRUG eksamenGOSELECT 'OPDATERING STATISTIK' + navn + ' MED SAMPLE 25 PROCENT;' som STMT fra sys.tables;VÆLG 'OPDATERE STATISTIK [' + navn + '] MED SAMPLE 25 PROCENT;' som STMT fra sys.tables;GO

Læg mærke til de firkantede parenteser i den anden sætning. Det er nyttigt, når du skal håndtere et systemobjekt med mellemrum eller specialtegn.

-- Liste 7 Generering af Opret brugererklæringer BRUG MASTERGOSELECT 'CREATE USER [' + LOGINNAME + '] FOR LOGIN [' + LOGINNAME + '];' SOM STMT FRA SYSLOGINSHvor LOGINNAVN IKKE SOM '#%';GOUSE EXAMGOCREATE USER [sa] TIL LOGIN [sa];CREATE USER [EPG-KIGIRI\ekocauris] TIL LOGIN [EPG-KIGIRI\ekocauris];CREATE]BRUGER [KAIROSgiriAFRIKA [KAIROSgiriAFRIKA] FOR LOGIN [KAIROSAFRIKA\kigiri];OPRET BRUGER [NT SERVICE\SQLWriter] TIL LOGIN [NT SERVICE\SQLWriter];OPRET BRUGER [NT SERVICE\Winmgmt] TIL LOGIN [NT SERVICE\WinmgMS\BRUGER] [NT$ Service I2019] FOR LOGIN [NT Service\MSSQL$I2019];CREATE USER [NT AUTHORITY\SYSTEM] FOR LOGIN [NT AUTHORITY\SYSTEM];CREATE USER [NT SERVICE\SQLAgent$I2019] FOR LOGIN [NT SERVICE\SQLAgent]$;CREATE USER [NT SERVICE\SQLTELEMETRY$I2019] FOR LOGIN [NT SERVICE\SQLTELEMETRY$I2019];CREATE USER [KAIROSAFRIKA\sberko] FOR LOGIN [KAIROSAFRIKA\sberko];GO

Når outputtet er genereret, kan det bruges til at oprette brugere i enhver ønsket database som vist i liste 7. Bemærk, at vi har tilføjet et filter for de login-navne, vi er interesserede i. Denne tilgang kan bruges til at generere alle mulige udsagn og kalde sådanne udtalelser inden for samme session. Et mere komplekst eksempel er følgende udsagn, som kreativt genopbygger alle indekser i enhver database. (Se liste 8 og 9).

--Liste 8 Generering af indeks genopbygge erklæringer BRUG EXAMGOCREATE TABEL #INDTAB (ID SMALLINT IDENTITY(1,1), REBUILDSTMT NVARCHAR(600))INDSÆT I #INDTAB VÆLG 'SET CITAT_IDENTIFIKATION PÅ;ALTER INDEX [' + B.NAVN '] PÅ [' + SCHEMA_NAME(C.SCHEMA_ID) + '].[' + OBJECT_NAME(A.OBJECT_ID) + '] GENBYGGE MED (ONLINE =OFF,FILLFACTOR=80,SORT_IN_TEMPDB=ON,PAD_INDEX =TIL, STATISTICS_NORECOMPUTER );'--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_IDON A. .OBJECT_ID AND A.INDEX_ID =B.INDEX_ID WHERE AVG_FRAGMENTATION_IN_PERCENT> 30;SELECT * FRA #INDTAB;GODROP TABLE #INDTAB;GO--Listing 9 Generation and Executing Index Rebuild StatementsUSE EXAMGOCREATE ID TABLE(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) + '] GENBYG MED (ONLINE =OFF,FILLFACTOR=80,SORT_IN_TEMPDB=ON,PAD_INDEX =ON, STATISTICS_NORECOMPUTE =OFF);'--INTO #INDTABFROM SYS.DM_DB_INDEX_PHYSICAL_NULL(NULLID,LL,NULLID,LL) ) SOM EN JOIN SYS.INDEXES AS B JOIN SYS.OBJECTS AS CON B.OBJECT_ID =C.OBJECT_IDON A.OBJECT_ID =B.OBJECT_ID OG A.INDEX_ID =B.INDEX_ID HVOR AVG_FRAGMENTATION_IN_PERCENT @ 30;QGODEL NCLARCHAR0); VÆLG @SQL=REBUILDSTMT FRA #INDTAB;PRINT @SQLEXEC SP_EXECUTESQL @SQL;GODROP TABLE #INDTAB;GO

Forespørgslen i liste 10 viser, hvordan vi kan kombinere strenge med datoer eksplicit konverteret til strenge. Stringsammenkædning bruges til at generere en fælles backup-stivariabel, som senere bruges i SP_MSFOREACHDB-funktionen.

--List 10 Generering af en fælles backup-stiEXEC SP_MSFOREACHDB @COMMAND1='DECLARE @BACKUP SYSNAMESET @BACKUP=N''G:\BACKUP\?''+CONVERT(NVARCHAR,GETDATE(),112)+N'' .BAK''BRUG [?]HVIS ''?'' IKKE I ("MODEL","TEMPDB")BEGINBACKUP DATABASE ? TO DISK =@BACKUP WITH INIT , NOUNLOAD , COMPRESSION, NAME =N''?'', NOSKIP , NOFORMATEND'

Konklusion

I denne artikel har vi vist et par måder at bruge sammenkædning i SQL Server. Vi har givet eksempler på CONCAT-funktionen, CONCAT_WS-funktionen og brugen af ​​"+"-tegnet. Alle tre metoder kan være meget nyttige til at generere udsagn ved at kombinere værdier fra forskellige kolonner eller blot for at vise information i et ønsket menneskevenligt format. Microsoft-dokumentation har flere oplysninger om syntaks og muligheder for disse funktioner.

Referencer

Cast og konverter (Transact-SQL)

Concat Transact-SQL

Concat_ws Transact-SQL

Strengsammenkædning


  1. Databasemodeller for e-handel Del 1:Nyhedsbrevet

  2. Hvor mange poster kan jeg gemme i 5 MB PostgreSQL på Heroku?

  3. Ulovlig instruktion:4 når du kører Django

  4. Sådan fungerer UTC_TIMESTAMP() i MariaDB