SQL Server'da Bir Dizeyi Sınırlandırılmış Bir Karakterle Nasıl Bölünür?
Bu makalede, sınırlandırılmış dize değerini bölmenin birkaç yolunu tartışacağız. Dahil olmak üzere birden fazla yöntem kullanılarak elde edilebilir.
- Dizeyi bölmek için STRING_SPLIT işlevinin kullanılması
- Dizeyi bölmek için kullanıcı tanımlı tablo değerli bir işlev oluşturun,
- Dize değerini bölmek ve sınırlandırılmış bir dizeyi XML'e dönüştürmek için XQuery kullanın
Her şeyden önce, her üç yöntemde de kullanılacak bir tablo oluşturmalı ve içine veri eklemeliyiz. Tablo, alan kimliğine sahip tek bir satır ve içinde sınırlayıcı karakterler bulunan dize içermelidir. Aşağıdaki kodu kullanarak "öğrenci" adlı bir tablo oluşturun.
CREATE TABLE öğrencisi (ID INT IDENTITY (1, 1), öğrenci_adı VARCHAR (MAX))
Aşağıdaki kodu yürüterek tek bir satıra virgülle ayrılmış öğrenci adlarını girin.
INSERT INTO öğrenci (öğrenci_adı) DEĞERLERİ ('Monroy, Montanez, Marolahakis, Negley, Albright, Garofolo, Pereira, Johnson, Wagner, Conrad')
Verilerin tabloya eklenip eklenmediğini aşağıdaki kodu kullanarak doğrulayın.
öğrenciden * seçin
Yöntem 1: Dizeyi bölmek için STRING_SPLIT işlevini kullanın
SQL Server 2016'da, "STRING_SPLIT" Uyumluluk düzeyi 130 ve üzeri ile kullanılabilen işlev tanıtıldı. 2016 SQL Server sürümünü veya daha üstünü kullanıyorsanız bu yerleşik işlevi kullanabilirsiniz.
Ayrıca "STRING_SPLIT" sınırlandırılmış alt dizelere sahip bir dize ve sınırlayıcı veya ayırıcı olarak kullanmak için bir karakter girer. İşlev, satırları alt dizeleri içeren tek sütunlu bir tablo çıkarır. Çıktı sütununun adı "Değer ". Bu işlev iki parametre alır. İlk parametre bir dizedir ve ikincisi dizeyi bölmemiz gereken sınırlayıcı karakter veya ayırıcıdır. Çıktı, alt dizelerin bulunduğu tek sütunlu bir tablo içerir. Bu çıktı sütununun adı "Değer" aşağıdaki şekilde görebileceğimiz gibi. Dahası, "STRING SPLIT" table_valued işlevi, giriş dizesi NULL ise boş bir tablo döndürür.
Veritabanının uyumluluk seviyesi:
Her veritabanı bir uyumluluk düzeyiyle bağlantılıdır. Veritabanının davranışının üzerinde çalıştığı belirli SQL Server sürümüyle uyumlu olmasını sağlar.
Şimdi virgülle ayrılmış dizgeyi bölmek için "string_split" işlevini çağıracağız. Ancak uyumluluk seviyesi 130'dan azdı, bu nedenle aşağıdaki hata yükseltildi. "Geçersiz nesne adı" SPLIT_STRING "
Bu nedenle veritabanı uyumluluk düzeyini 130 veya üstüne ayarlamamız gerekiyor. Bu nedenle, veritabanının uyumluluk seviyesini belirlemek için bu adımı takip edeceğiz.
- Öncelikle aşağıdaki kodu kullanarak veritabanını “single_user_access_mode” olarak ayarlayın.
ALTER VERİTABANI <[veritabanı_adı]> SINGLE_USER AYARLA
- İkinci olarak, aşağıdaki kodu kullanarak veritabanının uyumluluk düzeyini değiştirin.
ALTER VERİTABANI <[veritabanı_adı]> UYUMLULUK AYARLA_LEVEL = 130
- Aşağıdaki kodu kullanarak veritabanını çoklu kullanıcı erişim moduna geri getirin.
ALTER VERİTABANI <[veritabanı_adı]> MULTI_USER AYARLA
[Ana] KULLANIM ALTER VERİTABANINA GİT [köprü_ merkezlilik] SINGLE_USER DEĞİŞİKLİK VERİTABANI AYARLA [köprü_ merkezlilik] UYUMLULUK AYARLA_LEVEL = 130 ALTER VERİTABANI [köprü_ merkezlilik] MULTI_USER GİT
Çıktı şu şekilde olacaktır:
Şimdi gerekli sonucu almak için bu kodu çalıştırın.
DECLARE @string_value VARCHAR (MAX); SET @ string_value = 'Monroy, Montanez, Marolahakis, Negley, Albright, Garofolo, Pereira, Johnson, Wagner, Conrad' STRING_SPLIT'DEN SEÇ * (@string_value, ',')
Bu sorgu için çıktı:
Yöntem 2: Dizeyi bölmek için kullanıcı tanımlı tablo değerli bir işlev oluşturun
Elbette, bu geleneksel yöntem SQL Server'ın tüm sürümleri tarafından desteklenir. Bu teknikte, dizeyi "ALT STRING"İşlevi"CHARINDEX"Ve döngü sırasında. Bu fonksiyon, dönüş türü "tablo" olduğu için çıktı tablosuna veri eklemek için kullanılabilir.
CREATE FUNCTION [dbo]. [Split_string] (@string_value NVARCHAR (MAX), @delimiter_character CHAR (1)) RETURNS @result_set TABLE (splited_data NVARCHAR (MAX)) BEGIN DECLARE @start_position INT, @ending_position = INT SELECT @start @ending_position = CHARINDEX (@delimiter_character, @string_value) WHILE @start_positionŞimdi, dizeyi ayırıcı karaktere göre bölmek üzere bir bölme işlevi çağırmak için aşağıdaki komut dosyasını çalıştırın.
@ Öğrenci_adı VARCHAR (MAX); DECLARE @ sınırlayıcı CHAR (1); SET @ delimiter = ',' SET @student_name = (Öğrenciden öğrenci_adı seçin) SEÇİN * dbo.split_string (@ öğrenci_adı, @delimiter)Sonuç kümesi şöyle olacak.
Yöntem 3: Dize değerini bölmek ve sınırlandırılmış bir dizeyi XML'e dönüştürmek için XQuery kullanın
Kullanıcı tanımlı işlevler kaynak kapsamına girdiğinden, bu işlevlerden kaçınmalıyız. Diğer bir seçenek yerleşik “dizgi_split” işlevidir, ancak bu işlev uyumluluk düzeyi 130 veya daha yüksek olan veritabanı için kullanılabilir. İşte bu zor görevi çözmek için başka bir çözüm geliyor. Aşağıdakiler kullanılarak bir dize bölünebilir XML.
@Xml_value AS XML, @string_value AS VARCHAR (2000), @delimiter_value AS VARCHAR (15) SET @ string_value = (öğrenciden öğrenci_adı seçin) SET @delimiter_value = ',' SET @xml_value = Cast ((''+ Değiştir (@string_value, @delimiter_value,' ' ') + ' ') XML AS) SEÇİN @xml_valueBu sorgunun çıktısı şöyle olacaktır:
XML dosyasının tamamını görüntülemek istiyorsanız. Linki tıkla. Bir kez tıkladığınızda bağlantı kodu şöyle görünecektir.
Şimdi XML dizesi daha fazla işlenmelidir. Son olarak, XML'den sorgulamak için "x-Query" kullanacağız.
@Xml_value AS XML, @string_value AS VARCHAR (2000), @delimiter_value AS VARCHAR (15) SET @ string_value = (öğrenciden öğrenci_adı seçin) SET @delimiter_value = ',' SET @xml_value = Cast ((''+ Değiştir (@string_value, @delimiter_value,' ' ') + ' ') XML OLARAK) x.m.query ('. ']. Value ('. ',' VARCHAR (15) ') AS DEĞER @ xml_value.nodes (' / öğrenciadı ') AS x (m) SEÇİNÇıktı şöyle olacak: