sql >> Databasteknik >  >> RDS >> Database

Sammankoppling i Transact-SQL

Introduktion

Förutsatt att du har en tabell som innehåller kunddata och din chef ber dig att skicka den aktuella listan över kunder och deras telefonnummer till honom. Du skulle vanligtvis extrahera data och skicka honom ett kalkylblad med rader och kolumner. Du kan också välja att vara lite stilig och skicka honom den information som krävs i ett mer folkvänligt format. SQL Server tillhandahåller funktioner som gör att vi kan uppnå detta genom att kombinera engelska uttryck med data i tabeller för att presentera en utdata som är lättare att läsa för icke-tekniska personer. Dessa funktioner kan också användas för mer subtil användning.

CONCAT-funktionen

CONCAT-funktionen accepterar två eller flera strängargument och returnerar kombinationen av sådana strängar som ett enda uttryck. Detta kan vara användbart om du vill visa innehållet i olika kolumner som ett enda uttryck. Ett enkelt exempel på hur denna funktion används visas i Lista 1.

-- Lista 1:Simple CONCAT Statements välj CONCAT('This','Function','joins','strings.') as statement1;välj CONCAT('Denna ','Function','joins','strängar .') som påstående2;välj CONCAT('Detta',' ','Funktion',' ','joins',' ','strängar') som påstående

Lägg märke till variationerna av detta uttalande med hjälp av mellanslag och resultaten i Fig. 1.

Fig. 1. Enkelt CONCAT-uttalande

Om vi ​​försöker använda CONCAT-satsen med ett ingångsvärde av INT-datatypen, gör SQL Server en implicit konvertering och returnerar fortfarande en strängutgång som visas i Fig. 2. Vi kan bekräfta att detta är vad som faktiskt händer genom att gräva djupt i detaljer om uttalandet i lista 2. Först och främst, ta en titt på strukturen för tabellen vi är intresserade av. Fig. 2 visar att PhoneNumber# och FirstTranDate kolumner är BIGINT respektive DATETIME.

Fig. 2. Kundtabellens struktur

-- Lista 2:Implicit konvertering När du använder CONCAT (BIGINT)USE EXAMGOSELECT CONCAT(förnamn, ' ',efternamn, ''s ', 'Telefonnummer är ',telefonnummer1) FRÅN KUND;

Att ta en snabb titt på exekveringsplanen visar att SQL Server utför en implicit konvertering i kolumnen Telefonnummer1. Detta kommer att vara detsamma om kolumnen var datumdatatypen som visas i listning 4 och figur 4. CONCAT-funktionen utför implicit konvertering baserat på reglerna som beskrivs i diagrammet som visas i figur 6.

Fig. 3. Implicit konvertering av BIGINT-datatypen till VARCHAR

-- Lista 3:Implicit konvertering När du använder CONCAT (DATETIME)USE EXAMGOSELECT FirstTranDate, CONCAT(FirstName, ' ', LastName, '''s ', 'Första transaktionsdatumet är ',FirstTranDate) som STMTFROM KUND; 

Fig. 4. Implicit konvertering av DATETIME datatyp till VARCHAR

Fig. 5. Implicit konvertering av BIGINT-datatypen till VARCHAR

Fig. 6. Datatypkonvertering i SQL Server

Det primära användningsfallet för denna funktion kan härledas från demonstrationerna ovan. Ett exempel skulle vara ett fall där viss information måste visas på en instrumentpanel eller webbsida på ett mer användarvänligt språk med hjälp av data från ett antal kolumner eller till och med separata tabeller.

CONCAT_WS-funktionen

CONCAT_WS-funktionen är en förlängning av CONCAT-funktionen. Det tillåter oss att ange en önskad separator som den första parametern. Lista 4 visar oss en modifiering av ett av de påståenden vi tidigare använde i Lista 1.

--Listning 4 Använder CONCAT_WSSELECT CONCAT('This',' ','Function',' ','joins',' ','strängar') AS-sats;SELECT CONCAT('This',' ',' Function',' ','joins',' ','strings') AS-sats;SELECT CONCAT_WS(' ','This','Function','joins','strings') AS-sats;

Observera att CONCAT_WS gör det enklare att konstruera ett påstående med mellanslag som avgränsare jämfört med att införa ett mellanslag som ett argument efter varje argument.

--List 5 Använda CONCAT_WS med kolumnerUSE EXAMGOSELECT CONCAT(förnamn, '',efternamn, ''s ', 'Telefonnummer är',telefonnummer1) FRÅN KUND;ANVÄND EXAMGOSELECT CONCAT_WS(' ',förnamn,efternamn, ' ''s ', 'Telefonnummer är',telefonnummer1) FRÅN KUND;

Sammanfogning med "+"-tecknet

SQL Server stöder användningen av "+"-tecknet för att uppnå vad CONCAT-funktionen gör på ett mycket enklare sätt. Denna metod används vanligtvis för att generera T-SQL-satser när du behöver utföra operationer på ett stort antal objekt. Lista 7 visar hur vi kan generera en statistikuppdateringsbatch för alla tabeller i examensdatabasen.

-- Lista 6 Generera uppdateringsstatistik ANVÄND ExamGOSELECT 'UPPDATERA STATISTIK ' + namn + ' MED EXEMPEL 25 PROCENT;' som STMT från sys.tables;VÄLJ 'UPPDATERA STATISTIK [' + namn + '] MED EXEMPEL 25 PROCENT;' som STMT från sys.tables;GO

Lägg märke till hakparenteserna i det andra påståendet. Det är användbart när man hanterar ett systemobjekt med mellanslag eller specialtecken.

-- Lista 7 Generera Skapa användarutlåtanden ANVÄND MASTERGOSELECT 'SKAPA ANVÄNDARE [' + LOGINNAMN + '] FÖR LOGGA IN [' + LOGINNAMN + '];' SOM STMT FRÅN SYSLOGINSWHERE LOGINNAME INTE SOM '#%';GOUSE EXAMGOCREATE USER [sa] FÖR LOGGA IN [sa];CREATE USER [EPG-KIGIRI\ekocauris] FÖR LOGIN IN [EPG-KIGIRI\ekocauris];CREATE]ANVÄNDARE [KAIROSgiriAFRIKA FÖR LOGGA IN [KAIROSAFRIKA\kigiri];SKAPA ANVÄNDARE [NT SERVICE\SQLWriter] FÖR LOGGA IN [NT SERVICE\SQLWriter];SKAPA ANVÄNDARE [NT SERVICE\Winmgmt] FÖR LOGGA IN [NT SERVICE\Winmgms\USER];NT$ Tjänst I2019] FÖR LOGGA IN [NT-tjänst\MSSQL$I2019];SKAPA ANVÄNDARE [NT AUTHORITY\SYSTEM] FÖR LOGGA IN [NT AUTHORITY\SYSTEM];SKAPA ANVÄNDARE [NT SERVICE\SQLAgent$I2019] FÖR LOGGA IN [NT SERVICE\SQLAgent]$;SKAPA ANVÄNDARE [NT SERVICE\SQLTELEMETRY$I2019] FÖR LOGGA IN [NT SERVICE\SQLTELEMETRY$I2019];SKAPA ANVÄNDARE [KAIROSAFRIKA\sberko] FÖR LOGGA IN [KAIROSAFRIKA\sberko];GO

När utdata har genererats kan den användas för att skapa användare i vilken databas som helst som visas i Lista 7. Observera att vi har lagt till ett filter för de inloggningsnamn vi är intresserade av. Detta tillvägagångssätt kan användas för att generera alla möjliga påståenden och kalla sådana uttalanden inom samma session. Ett mer komplext exempel är följande satser som kreativt bygger om alla index i vilken databas som helst. (Se listorna 8 och 9).

--Lista 8 Generera indexåterbygga uttalanden ANVÄND EXAMGOSKAPA TABELL #INDTAB (ID SMALLINT IDENTITY(1,1), REBUILDSTMT NVARCHAR(600))INSERT INTO #INDTAB VÄLJ 'STÄLL IN CITAT_IDENTIFIERAR PÅ;ALTER INDEX [' + B.NAME '] PÅ [' + SCHEMA_NAME(C.SCHEMA_ID) + '].[' + OBJECT_NAME(A.OBJECT_ID) + '] OMBYGGD MED (ONLINE =OFF,FILLFACTOR=80,SORT_IN_TEMPDB=ON,PAD_INDEX =PÅ, 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 .OBJECT_ID AND A.INDEX_ID =B.INDEX_ID WHERE AVG_FRAGMENTATION_IN_PERCENT> 30;SELECT * FROM #INDTAB;GODROP TABLE #INDTAB;GO--Listing 9 Generera och exekvera indexåteruppbyggnadssatser ANVÄND 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) + '] ÅTERBYGGNAD MED (ONLINE =AV,FILLFACTOR=80,SORT_IN_TEMPDB=ON,PAD_INDEX =PÅ, STATISTICS_NORECOMPUTE =AV);'--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 AND A.INDEX_ID =B.INDEX_ID WHERE AVG_FRAGMENTATION_IN_PERCENT @ 30;QGODEL NCLARCH0); VÄLJ @SQL=REBUILDSTMT FRÅN #INDTAB;PRINT @SQLEXEC SP_EXECUTESQL @SQL;GODROP TABELL #INDTAB;GO

Frågan i Lista 10 visar hur vi kan kombinera strängar med datum som uttryckligen konverterats till strängar. Strängsammansättningen används för att generera en gemensam backup-sökvägsvariabel som senare används inom SP_MSFOREACHDB-funktionen.

--Lista 10 Generera en gemensam säkerhetskopieringsvägEXEC SP_MSFOREACHDB @COMMAND1='DECLARE @BACKUP SYSNAMESET @BACKUP=N''G:\BACKUP\?''+CONVERT(NVARCHAR,GETDATE(),112)+N'' .BAK''ANVÄND [?]OM ''?'' INTE I ("MODEL","TEMPDB") BÖRJA SÄKERHETSKOPIERING DATABAS? TO DISK =@BACKUP WITH INIT , NOUNLOAD , COMPRESSION, NAME =N''?'', NOSKIP , NOFORMATEND'

Slutsats

I den här artikeln har vi visat några sätt att använda sammanlänkning i SQL Server. Vi har gett exempel på CONCAT-funktionen, CONCAT_WS-funktionen och användningen av "+"-tecknet. Alla tre metoderna kan vara mycket användbara för att generera påståenden genom att kombinera värden från olika kolumner eller helt enkelt för att visa information i ett önskat personvänligt format. Microsofts dokumentation har mer information om syntaxen och funktionerna för dessa funktioner.

Referenser

Casta och konvertera (Transact-SQL)

Concat Transact-SQL

Concat_ws Transact-SQL

Strängsammansättning


  1. Beräkna InnoDB buffertpoolstorlek för din MySQL-server

  2. NULL komplexitet – Del 4, Saknar unik standardbegränsning

  3. Få [archiver] ostödd version (1.13) i filhuvudet när du kör pg_restore

  4. Snabbt sätt att upptäcka radantalet i en tabell i PostgreSQL