sql >> Databáze >  >> RDS >> Database

Zřetězení v Transact-SQL

Úvod

Za předpokladu, že udržujete tabulku obsahující údaje o zákaznících a váš šéf vás požádá, abyste mu poslali aktuální seznam zákazníků a jejich telefonní čísla. Obvykle byste extrahovali data a poslali mu tabulku s řádky a sloupci. Můžete se také rozhodnout být trochu styloví a poslat mu požadované informace ve formátu, který je pro lidi příjemnější. SQL Server poskytuje funkce, které nám umožňují toho dosáhnout kombinací anglických výrazů s daty v tabulkách, aby byl prezentován výstup, který je snadněji čitelný pro netechnické osoby. Tyto funkce lze také využít jemnějším způsobem.

Funkce CONCAT

Funkce CONCAT přijímá dva nebo více řetězcových argumentů a vrací kombinaci těchto řetězců jako jeden výraz. To může být užitečné, pokud chcete zobrazit obsah různých sloupců jako jeden výraz. Jednoduchý příklad použití této funkce je uveden ve výpisu 1.

-- Výpis 1:Jednoduchý příkaz CONCATselect CONCAT('This','Function','joins','strings.') as statement1;select CONCAT('This ','Function','joins','strings .') as statement2;select CONCAT('This',' ','Function',' ','joins',' ','strings') as statement

Všimněte si variací tohoto tvrzení pomocí mezery a výsledků na obr. 1.

Obr. 1. Jednoduchý příkaz CONCAT

Pokud se pokusíme použít příkaz CONCAT se vstupní hodnotou datového typu INT, SQL Server provede implicitní převod a přesto vrátí výstup řetězce, jak je znázorněno na obr. 2. Můžeme potvrdit, že se to skutečně děje, když se ponoříme hluboko do podrobnosti o výpisu ve výpisu 2. Nejprve se podívejte na strukturu tabulky, která nás zajímá. Obr. 2 nám ukazuje, že Telefonní číslo# a FirstTranDate sloupce jsou BIGINT a DATETIME.

Obr. 2. Struktura tabulky zákazníků

-- Výpis 2:Implicitní převod při použití CONCAT (BIGINT)POUŽÍVEJTE EXAMGOSELECT CONCAT(křestní jméno, ' ',příjmení, '''s ', 'Telefonní číslo je ',telefonní číslo1) OD ZÁKAZNÍKA;

Rychlý pohled na plán provádění nám ukazuje, že SQL Server provádí implicitní konverzi ve sloupci PhoneNumber1. To bude stejné, pokud byl sloupec datovým typem data, jak je znázorněno na Výpisu 4 a Obr. 4. Funkce CONCAT provádí implicitní převod na základě pravidel uvedených v grafu na Obr. 6.

Obr. 3. Implicitní převod datového typu BIGINT na VARCHAR

-- Výpis 3:Implicitní konverze Při použití CONCAT (DATETIME) POUŽÍVEJTE EXAMGOSELECT FirstTranDate, CONCAT(FirstName, ' ', LastName, '''s ', 'první transakce datum je ',FirstTranDate) jako STMTFROM CUSTOMER; 

Obr. 4. Implicitní konverze Datový typ DATETIME na VARCHAR

Obr. 5. Implicitní převod datového typu BIGINT na VARCHAR

Obr. 6. Konverze datových typů v SQL Server

Primární případ použití této funkce lze odvodit z ukázek výše. Příkladem může být případ, kdy je třeba některé informace zobrazit na řídicím panelu nebo webové stránce v přívětivějším jazyce pomocí dat z několika sloupců nebo dokonce samostatných tabulek.

Funkce CONCAT_WS

Funkce CONCAT_WS je rozšířením funkce CONCAT. Umožňuje nám zadat požadovaný oddělovač jako první parametr. Výpis 4 nám ukazuje modifikaci jednoho z příkazů, které jsme dříve použili ve Výpisu 1.

--Výpis 4 Použití příkazu CONCAT_WSSELECT CONCAT('Toto',' ','Funkce',' ','joins',' ','strings') AS;SELECT CONCAT('Toto',' ',' Function',' ','joins',' ','strings') AS příkaz;SELECT CONCAT_WS(' ','This','Function','joins','strings') AS příkaz;

Všimněte si, že CONCAT_WS usnadňuje sestavení příkazu s mezerou jako oddělovačem ve srovnání se zavedením mezery jako argumentu po každém argumentu.

--Výpis 5 Použití CONCAT_WS s ColumnsUSE EXAMGOSELECT CONCAT(křestní jméno, ' ',příjmení, '''s ', 'Telefonní číslo je ',telefonní číslo1) OD ZÁKAZNÍKA;POUŽÍVEJTE EXAMGOSELECT CONCAT_WS(' ',jméno,příjmení, ' ''s ', 'Phone number is',phonenumber1) OD ZÁKAZNÍKA;

Zřetězení se znaménkem „+“

SQL Server podporuje použití znaménka „+“ k dosažení toho, co funkce CONCAT dělá mnohem jednodušším způsobem. Tento přístup se obvykle používá ke generování příkazů T-SQL, když potřebujete provádět operace s velkým počtem objektů. Výpis 7 ukazuje, jak můžeme vygenerovat dávku aktualizace statistik pro všechny tabulky v databázi zkoušek.

-- Výpis 6 Generování aktualizačních statistických výkazůPOUŽÍVEJTE ExamGOSELECT 'AKTUALIZOVAT STATISTIKY ' + jméno + ' SE VZOREM 25 PROCENT;' jako STMT ze sys.tables;ZVOLTE 'AKTUALIZOVAT STATISTIKY [' + jméno + '] S VZOREM 25 PROCENT;' jako STMT ze sys.tables;GO

Všimněte si hranatých závorek ve druhém příkazu. Je to užitečné při práci se systémovým objektem s mezerami nebo speciálními znaky.

-- Výpis 7 Generování prohlášení o vytvoření uživatelePOUŽÍVEJTE MASTERGOSELECT 'CREATE USER [' + LOGINNAME + '] FOR LOGIN [' + LOGINNAME + '];' JAKO STMT ZE SYSLOGINSWHERE PŘIHLAŠOVACÍ JMÉNO NENÍ AKO '#%';GOUSE EXAMGOCREATE USER [sa] PRO PŘIHLÁŠENÍ [sa];VYTVOŘENÍ UŽIVATELE [EPG-KIGIRI\ekocauris] PRO PŘIHLÁŠENÍ [EPG-KIGIRI\ekocauris] [;\CAIROSIAFRIKA]USER PRO PŘIHLÁŠENÍ [KAIROSAFRIKA\kigiri];VYTVOŘIT UŽIVATELE [NT SERVICE\SQLWriter] PRO PŘIHLÁŠENÍ [NT SERVICE\SQLWriter];VYTVOŘIT UŽIVATELE [NT SERVICE\Winmgmt] PRO PŘIHLÁŠENÍ [NT SERVICE\Winmgmt];VYTVOŘIT UŽIVATELE [NT Service\MSSQL$ I2019] PRO PŘIHLÁŠENÍ [NT Service\MSSQL$I2019];VYTVOŘIT UŽIVATELE [NT AUTHORITY\SYSTEM] PRO PŘIHLÁŠENÍ [NT AUTHORITY\SYSTEM];VYTVOŘIT UŽIVATELE [NT SERVICE\SQLAgent$I2019] PRO PŘIHLÁŠENÍ [NT SERVICE\SQLAgent$I2019];VYTVOŘIT UŽIVATELE [NT SERVICE\SQLTELEMETRY$I2019] PRO PŘIHLÁŠENÍ [NT SERVICE\SQLTELEMETRY$I2019];VYTVOŘIT UŽIVATELE [KAIROSAFRIKA\sberko] PRO PŘIHLÁŠENÍ [KAIROSAFRIKA\sberko];PŘEJÍT

Jakmile je výstup vygenerován, lze jej použít k vytvoření uživatelů v libovolné požadované databázi, jak je uvedeno ve výpisu 7. Všimněte si, že jsme přidali filtr pro přihlašovací jména, která nás zajímají. Tento přístup lze použít ke generování nejrůznějších výpisů a volat taková prohlášení v rámci stejné relace. Složitějším příkladem jsou následující příkazy, které kreativně znovu sestaví všechny indexy v libovolné databázi. (Viz výpisy 8 a 9).

--Výpis 8 Generování výpisů pro obnovu indexuPOUŽÍVEJTE EXAMGOCREATE TABLE #INDTAB (ID SMALLINT IDENTITY(1,1), REBUILDSTMT NVARCHAR(600))INSERT INTO #INDTAB VYBERTE 'SET QUOTED_IDENTIFIER ON;ALTER B.INDEX + [' + '] ON [' + SCHEMA_NAME(C.SCHEMA_ID) + '].[' + OBJECT_NAME(A.OBJECT_ID) + '] ZNOVU SESTAVIT S (ONLINE =VYPNUTO, FILLFACTOR=80,SORT_IN_TEMPDB=ZAPNUTO,PAD_INDEX =ZAPNUTO, STATISTIKY_NENÍ );'--INTO #INDTABFROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(), NULL, NULL, NULL, NULL) JAKO JOIN SYS.INDEXES JAKO B JOIN SYS.OBJECTS JAKO CON B.OBJECT_ID =C.OBJECT_ID_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 Generování a provádění příkazů k přestavbě indexuPOUŽÍVEJTE EXAMGOCREATE,1INT TABULE ALL #INDITY(TAIDENT) , 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_PHYLL,LLLLS,NUB ) JAKO JOIN SYS.INDEXES JAKO B PŘIPOJIT SYS.OBJECTS JAKO CON B.OBJECT_ID =C.OBJECT_IDON A.OBJECT_ID =B.OBJECT_ID A A.INDEX_ID =B.INDEX_ID WHERE AVG_FRAGMENTATION_IN_PERCENT> 30 (NARCHSQL00CLARE) SELECT @SQL=REBUILDSTMT Z #INDTAB;PRINT @SQLEXEC SP_EXECUTESQL @SQL;GODROP TABLE #INDTAB;GO

Dotaz ve výpisu 10 ukazuje, jak můžeme kombinovat řetězce s daty explicitně převedenými na řetězce. Zřetězení řetězců se používá ke generování společné proměnné cesty k zálohování, která se později použije ve funkci SP_MSFOREACHDB.

--Výpis 10 Generování společné zálohovací cestyEXEC SP_MSFOREACHDB @COMMAND1='DECLARE @BACKUP SYSNAMESET @BACKUP=N''G:\BACKUP\?''+CONVERT(NVARCHAR,GETDATE(),112)+N'' .BAK''POUŽÍT [?]POKUD ''?'' NENÍ V ("MODEL","TEMPDB")ZAČÁTEK ZÁLOHU DATABÁZE? NA DISK =@BACKUP WITH INIT , NOUNLOAD , COMPRESSION,NAME =N''?'', NOSKIP , NOFORMATEND'

Závěr

V tomto článku jsme ukázali několik způsobů použití zřetězení v SQL Server. Uvedli jsme příklady funkce CONCAT, funkce CONCAT_WS a použití znaménka „+“. Všechny tři metody mohou být velmi užitečné při generování příkazů kombinací hodnot z různých sloupců nebo jednoduše pro zobrazení informací v požadovaném formátu, který je pro lidi přívětivý. Dokumentace společnosti Microsoft obsahuje další informace o syntaxi a možnostech těchto funkcí.

Odkazy

Cast and Convert (Transact-SQL)

Concat Transact-SQL

Concat_ws Transact-SQL

Zřetězení řetězců


  1. Export tabulky z databáze do souboru csv

  2. Oracle 11g na Mac OS X

  3. Rekurzivní dotaz používaný pro tranzitivní uzávěr

  4. Nástroj ADODFCMP