Pengantar
Dengan asumsi Anda memelihara tabel yang berisi data pelanggan, dan bos Anda meminta Anda untuk mengirimkan daftar pelanggan saat ini dan nomor telepon mereka. Anda biasanya mengekstrak data dan mengiriminya spreadsheet dengan baris dan kolom. Anda juga dapat memutuskan untuk sedikit bergaya dan mengirimkan informasi yang diperlukan kepadanya dalam format yang lebih ramah orang. SQL Server menyediakan fungsi yang memungkinkan kita untuk mencapai ini dengan menggabungkan ekspresi bahasa Inggris dengan data dalam tabel untuk menyajikan output yang lebih mudah dibaca oleh orang non-teknis. Fungsi-fungsi ini juga dapat digunakan untuk penggunaan yang lebih halus.
Fungsi CONCAT
Fungsi CONCAT menerima dua atau lebih argumen string dan mengembalikan kombinasi string tersebut sebagai ekspresi tunggal. Ini bisa berguna jika Anda ingin menampilkan konten kolom yang berbeda sebagai ekspresi tunggal. Contoh sederhana penggunaan fungsi ini ditunjukkan pada Listing 1.
-- Listing 1:Pernyataan CONCAT Sederhana pilih CONCAT('This','Function','joins','strings.') as statement1;select CONCAT('This ','Function ','joins ','strings .') sebagai pernyataan2;pilih CONCAT('Ini',' ','Fungsi',' ','bergabung',' ','string') sebagai pernyataan
Perhatikan variasi pernyataan ini dengan menggunakan spasi dan hasilnya pada Gambar 1.
Gbr. 1. Pernyataan CONCAT Sederhana
Jika kita mencoba menggunakan pernyataan CONCAT dengan nilai input tipe data INT, SQL Server melakukan konversi implisit dan masih mengembalikan output string seperti yang ditunjukkan pada Gambar 2. Kita dapat mengonfirmasi bahwa inilah yang sebenarnya terjadi dengan menggali jauh ke dalam rincian pernyataan pada Listing 2. Pertama-tama, perhatikan struktur tabel yang kita minati. Gambar 2 menunjukkan bahwa PhoneNumber# dan TanggalTran Pertama kolom masing-masing adalah kolom BIGINT dan DATETIME.
Gbr. 2. Struktur Tabel Pelanggan
-- Daftar 2:Konversi Implisit Saat menggunakan CONCAT (BIGINT)GUNAKAN EXAMGOSELECT CONCAT(nama depan, ' ,nama belakang, '''s ', 'Nomor telepon adalah ',nomor telepon1) FROM CUSTOMER;
Melihat sekilas rencana eksekusi menunjukkan kepada kita bahwa SQL Server melakukan konversi implisit pada kolom PhoneNumber1. Ini akan sama jika kolom adalah tipe data tanggal seperti yang ditunjukkan pada Daftar 4 dan Gambar 4. Fungsi CONCAT melakukan konversi implisit berdasarkan aturan yang diuraikan dalam bagan yang ditunjukkan pada Gambar 6.
Gbr. 3. Konversi implisit tipe data BIGINT ke VARCHAR
-- Listing 3:Konversi Implisit Saat menggunakan CONCAT (DATETIME)GUNAKAN EXAMGOSELECT FirstTranDate, CONCAT(FirstName, ' ,LastName, '''s ', 'first transaction date is ',FirstTranDate) sebagai STMTFROM CUSTOMER;
Gbr. 4. Konversi Implisit dari DATETIME tipe data ke VARCHAR
Gbr. 5. Konversi implisit tipe data BIGINT ke VARCHAR
Gbr. 6. Konversi Tipe Data di SQL Server
Kasus penggunaan utama untuk fungsi ini dapat disimpulkan dari demonstrasi di atas. Contohnya adalah kasus di mana beberapa informasi perlu ditampilkan di dasbor atau halaman web dalam bahasa yang lebih ramah menggunakan data dari sejumlah kolom atau bahkan tabel terpisah.
Fungsi CONCAT_WS
Fungsi CONCAT_WS adalah perpanjangan dari fungsi CONCAT. Hal ini memungkinkan kita untuk menentukan pemisah yang diinginkan sebagai parameter pertama. Listing 4 menunjukkan modifikasi dari salah satu pernyataan yang sebelumnya kita gunakan di Listing 1.
--Listing 4 Menggunakan CONCAT_WSSELECT CONCAT('This',' ','Function',' ','joins',' ','strings') AS pernyataan;SELECT CONCAT('This',' ',' Fungsi',' ','bergabung',' ','string') pernyataan AS;SELECT CONCAT_WS(' ','This','Function','joins','strings') pernyataan AS;Perhatikan bahwa CONCAT_WS mempermudah pembuatan pernyataan dengan spasi sebagai pemisah dibandingkan dengan memasukkan spasi sebagai argumen setelah setiap argumen.
--Listing 5 Menggunakan CONCAT_WS dengan KolomUSE EXAMGOSELECT CONCAT(nama depan, ' ,nama belakang, '''s ', 'Nomor telepon adalah ',nomor telepon1) FROM CUSTOMER;USE EXAMGOSELECT CONCAT_WS(' ',nama depan,nama belakang, ' ''s ', 'Nomor telepon', nomor telepon1) DARI PELANGGAN;Penggabungan dengan Tanda “+”
SQL Server mendukung penggunaan tanda "+" untuk mencapai apa yang dilakukan fungsi CONCAT dengan cara yang lebih sederhana. Pendekatan ini biasanya digunakan untuk menghasilkan pernyataan T-SQL ketika Anda perlu melakukan operasi pada sejumlah besar objek. Daftar 7 menunjukkan bagaimana kami dapat menghasilkan kumpulan pembaruan Statistik untuk semua tabel dalam database Ujian.
-- Listing 6 Menghasilkan Update Stats StatementsUSE ExamGOSELECT 'UPDATE STATISTICS ' + name + ' WITH SAMPLE 25 PERCENT;' sebagai STMT dari sys.tables;PILIH 'PERBARUI STATISTIKA [' + nama + '] DENGAN SAMPEL 25 PERCENT;' sebagai STMT dari sys.tables;GOPerhatikan tanda kurung siku pada pernyataan kedua. Ini berguna ketika berhadapan dengan objek sistem dengan spasi atau karakter khusus.
-- Listing 7 Menghasilkan Buat Pernyataan PenggunaGUNAKAN MASTERGOSELECT 'CREATE USER [' + LOGINNAME + '] UNTUK LOGIN [' + LOGINNAME + '];' SEBAGAI STMT DARI SYSLOGINSWHERE LOGINNAME NOT LIKE '#%';GOUSE EXAMGOCREATE USER [sa] FOR LOGIN [sa];CREATE USER [EPG-KIGIRI\ekocauris] FOR LOGIN [EPG-KIGIRI\ekocauris];CREATE USER [KAIROSAFRIKA\kigiri] UNTUK LOGIN [KAIROSAFRIKA\kigiri];CREATE USER [NT SERVICE\SQLWriter] FOR LOGIN [NT SERVICE\SQLWriter];CREATE USER [NT SERVICE\Winmgmt] FOR LOGIN [NT SERVICE\Winmgmt];CREATE USER [NT Service\MSSQL$ I2019] UNTUK LOGIN [NT Service\MSSQL$I2019];BUAT PENGGUNA [NT AUTHORITY\SYSTEM] UNTUK LOGIN [NT AUTHORITY\SYSTEM];BUAT PENGGUNA [NT SERVICE\SQLAgent$I2019] UNTUK LOGIN [NT SERVICE\SQLAgent$I2019];BUAT PENGGUNA [NT SERVICE\SQLTELEMETRY$I2019] UNTUK LOGIN [NT SERVICE\SQLTELEMETRY$I2019];BUAT PENGGUNA [KAIROSAFRIKA\sberko] UNTUK LOGIN [KAIROSAFRIKA\sberko];GOSetelah output dihasilkan, dapat digunakan untuk membuat pengguna di database yang diinginkan seperti yang ditunjukkan pada Listing 7. Perhatikan bahwa kami telah menambahkan filter untuk nama login yang kami minati. Pendekatan ini dapat digunakan untuk menghasilkan semua jenis pernyataan dan memanggil pernyataan tersebut dalam sesi yang sama. Contoh yang lebih kompleks adalah pernyataan berikut yang secara kreatif membangun kembali semua indeks dalam database apa pun. (Lihat Daftar 8 dan 9).
--Listing 8 Membuat Pernyataan Membangun Kembali IndeksUSE EXAMGOCREATE TABLE #INDTAB (ID SMALLINT IDENTITY(1,1), REBUILDSTMT NVARCHAR(600))INSERT INTO #INDTAB SELECT 'SET QUOTED_IDENTIFIER ON;ALTER INDEX [' + B.NAME + '] AKTIF [' + 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 =OFFRECOMPUTE );'--INTO #INDTABFROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(), NULL, NULL, NULL, NULL) SEBAGAI SYS.INDEXES GABUNG SEBAGAI B GABUNG SYS.OBJEK SEBAGAI CON B.OBJECT_ID =C.OBJECT_IDON =B.OBJECT_IDON .OBJECT_ID DAN A.INDEX_ID =B.INDEX_ID WHERE AVG_FRAGMENTATION_IN_PERCENT> 30;SELECT * FROM #INDTAB;GODROP TABLE #INDTAB;GO--Listing 9 Membuat dan Mengeksekusi Pernyataan Membangun Kembali IndeksUSE EXAMGOCREATE TABLE SMALLINT IDENTITY(1,ALLINT IDENTITY) , 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 (NULL_ID(), NULL_ID(), NULL_ID(), ) SEBAGAI JOIN SYS.INDEXES SEBAGAI B GABUNG SYS.OBJECTS SEBAGAI CON B.OBJECT_ID =C.OBJECT_IDON A.OBJECT_ID =B.OBJECT_ID DAN A.INDEX_ID =B.INDEX_ID WHERE AVG_FRAGMENTATION_IN_PERCENT> 30;G; PILIH @SQL=REBUILDSTMT DARI #INDTAB;PRINT @SQLEXEC SP_EXECUTESQL @SQL;GODROP TABLE #INDTAB;GOKueri di Listing 10 menunjukkan bagaimana kita dapat menggabungkan string dengan tanggal yang secara eksplisit dikonversi ke string. Penggabungan String digunakan untuk menghasilkan variabel jalur cadangan umum yang kemudian digunakan dalam fungsi SP_MSFOREACHDB.
--Listing 10 Membuat Jalur Pencadangan UmumEXEC SP_MSFOREACHDB @COMMAND1='DECLARE @BACKUP SYSNAMESET @BACKUP=N''G:\BACKUP\?''+CONVERT(NVARCHAR,GETDATE(),112)+N'' .BAK''GUNAKAN [?]JIKA ''?'' TIDAK DI ("MODEL","TEMPDB")BEGINBACKUP DATABASE ? TO DISK =@BACKUP WITH INIT , NOUNLOAD , COMPRESSION,NAME =N''?'', NOSKIP , NOFORMATEND'Kesimpulan
Pada artikel ini, kami telah menunjukkan beberapa cara untuk menggunakan penggabungan di SQL Server. Kami telah memberikan contoh fungsi CONCAT, fungsi CONCAT_WS dan penggunaan tanda “+”. Ketiga metode dapat sangat berguna dalam menghasilkan pernyataan dengan menggabungkan nilai dari kolom yang berbeda atau hanya untuk menampilkan informasi dalam format ramah-orang yang diinginkan. Dokumentasi Microsoft memiliki informasi lebih lanjut tentang sintaks dan kemampuan fungsi-fungsi ini.
Referensi
Transmisikan dan Konversi (Transact-SQL)
Concat Transact-SQL
Concat_ws Transact-SQL
Penggabungan String