Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: SQL Server 2016 (13.x) ve sonraki sürümleri
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
SQL analiz uç noktası Microsoft Fabric'teki Microsoft Fabric
SQL veritabanında Microsoft Fabric'te
STRING_SPLIT , bir dizeyi belirtilen ayırıcı karaktere göre alt dize satırlarına bölen tablo değerli bir işlevdir.
Uyumluluk düzeyi 130
STRING_SPLIT uyumluluk düzeyinin en az 130 olmasını gerektirir. Düzey 130'dan küçük olduğunda, Veritabanı Altyapısı işlevi bulamaz STRING_SPLIT .
Veritabanının uyumluluk düzeyini değiştirmek için veritabanının uyumluluk düzeyini görüntüleme veya değiştirme bölümüne bakın.
Uyarı
Azure Synapse Analytics'te için STRING_SPLIT uyumluluk yapılandırması gerekli değildir.
Transact-SQL söz dizimi kuralları
Sözdizimi
STRING_SPLIT ( string , separator [ , enable_ordinal ] )
Arguments
string
Herhangi bir karakter türünün ifadesi (örneğin, nvarchar, varchar, nchar veya char).
ayırıcı
Birleştirilmiş alt dizeler için ayırıcı olarak kullanılan herhangi bir karakter türünün (örneğin, nvarchar(1), varchar(1), nchar(1)veya char(1)) tek bir karakter ifadesi.
enable_ordinal
Şunlar için geçerlidir: Azure SQL Veritabanı, Azure SQL Yönetilen Örneği, Azure Synapse Analytics (yalnızca sunucusuz SQL havuzu) ve SQL Server 2022 (16.x) ve sonraki sürümleri
Çıkış sütununu etkinleştirmek veya devre dışı bırakmak için bayrak görevi görecek bir int veya bitordinal. değeri 1 sütunu etkinleştirir ordinal .
enable_ordinal atlanırsa NULLveya değerine 0ordinal sahipse sütun devre dışı bırakılır.
Dönüş türleri
ordinal Çıkış sütunu etkinleştirilmemişse, STRING_SPLIT satırları alt dize olan tek sütunlu bir tablo döndürür. Sütunun adı şeklindedir value. Giriş bağımsız değişkenlerinden herhangi biri nvarchar veya nchar ise nvarchar döndürür. Aksi takdirde , varchar döndürür. Dönüş türünün uzunluğu , dize bağımsız değişkeninin uzunluğuyla aynıdır.
enable_ordinal bağımsız değişkenine 1değeri geçirilirse, her alt dizenin giriş dizesindeki konumunun 1 tabanlı dizin değerlerinden oluşan adlı ordinal ikinci bir sütun döndürülür. Dönüş türü bigint'tir.
Açıklamalar
STRING_SPLIT sınırlandırılmış alt dizeleri olan bir dizeyi girer ve sınırlayıcı veya ayırıcı olarak kullanmak üzere bir karakter girer. İsteğe bağlı olarak işlev, sırasıyla 0 çıkış sütununu 1ordinal devre dışı bırakabilen veya etkinleştiren veya değerine sahip üçüncü bir bağımsız değişkeni destekler.
STRING_SPLIT enable_ordinal bağımsız değişkenine bağlı olarak tek sütunlu veya çift sütunlu bir tablo oluşturur.
enable_ordinal atlanırsa
NULLveya değerine0STRING_SPLITsahipse, satırları alt dizeleri içeren tek sütunlu bir tablo döndürür. Çıkış sütununun adı şeklindedirvalue.enable_ordinal değeri
1varsa işlev,ordinalözgün giriş dizesindeki alt dizelerin 1 tabanlı dizin değerlerinden oluşan sütunu içeren iki sütunlu bir tablo döndürür.
enable_ordinal bağımsız değişkeni, sütun veya değişken değil sabit bir değer olmalıdır. Ayrıca veya değerine sahip 0 veya 1 veri türü olmalıdır. Aksi takdirde işlev bir hata oluşturur.
Çıkış satırları herhangi bir sırada olabilir. Sıranın giriş dizesindeki alt dizelerin sırasıyla eşleşmesi garanti değildir . Deyiminde veya gibi ORDER BYSELECTbir ORDER BY value yan tümce ORDER BY ordinal kullanarak son sıralama düzenini geçersiz kılabilirsiniz.
0x0000 (char(0)), Windows harmanlamalarında tanımlanmamış bir karakterdir ve içine STRING_SPLITeklenemez.
Giriş dizesi sınırlayıcı karakterinin iki veya daha fazla ardışık tekrarını içerdiğinde boş sıfır uzunluklu alt dizeler bulunur. Boş alt dizeler, düz alt dizelerle aynı şekilde işlenir. Boş alt dize içeren satırları, örneğin WHEREyan tümcesini WHERE value <> '' kullanarak filtreleyebilirsiniz. Giriş dizesi ise NULL, STRING_SPLIT tablo değerli işlevi boş bir tablo döndürür.
Örneğin, aşağıdaki SELECT deyim ayırıcı olarak boşluk karakterini kullanır:
SELECT value FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ');
Bir alıştırma çalıştırmasında, yukarıdaki SELECT aşağıdaki sonuç tablosunu döndürdü:
| value |
|---|
Lorem |
ipsum |
dolor |
sit |
amet. |
Aşağıdaki örnek, isteğe bağlı üçüncü bağımsız değişkeni geçirerek ordinal sütunu etkinleştirir1:
SELECT * FROM STRING_SPLIT('Lorem ipsum dolor sit amet.', ' ', 1);
Bu deyim daha sonra aşağıdaki sonuç tablosunu döndürür:
| value | Sıralı |
|---|---|
Lorem |
1 |
ipsum |
2 |
dolor |
3 |
sit |
4 |
amet. |
5 |
Örnekler
A. Virgülle ayrılmış değer dizesini bölme
Değerlerin virgülle ayrılmış listesini ayrıştırın ve boş olmayan tüm belirteçleri döndürür:
DECLARE @tags NVARCHAR(400) = 'clothing,road,,touring,bike'
SELECT value
FROM STRING_SPLIT(@tags, ',')
WHERE RTRIM(value) <> '';
STRING_SPLIT ayırıcı arasında hiçbir şey yoksa boş bir dize döndürür. Koşul RTRIM(value) <> '' boş belirteçleri kaldırır.
B. Sütunda virgülle ayrılmış değer dizesini bölme
Ürün tablosunda, aşağıdaki örnekte gösterilen etiketlerin virgülle ayrılmış listesini içeren bir sütun vardır:
| Ürün Kimliği | İsim | Etiketler |
|---|---|---|
1 |
Full-Finger Gloves |
clothing,road,touring,bike |
2 |
LL Headset |
bike |
3 |
HL Mountain Frame |
bike,mountain |
Aşağıdaki sorgu, her etiket listesini dönüştürür ve bunları özgün satırla birleştirir:
SELECT ProductId, Name, value
FROM Product
CROSS APPLY STRING_SPLIT(Tags, ',');
Sonuç kümesi aşağıdadır.
| Ürün Kimliği | İsim | Değer |
|---|---|---|
1 |
Full-Finger Gloves |
clothing |
1 |
Full-Finger Gloves |
road |
1 |
Full-Finger Gloves |
touring |
1 |
Full-Finger Gloves |
bike |
2 |
LL Headset |
bike |
3 |
HL Mountain Frame |
bike |
3 |
HL Mountain Frame |
mountain |
Uyarı
Çıkış sırası, giriş dizesindeki alt dizelerin sırasıyla eşleşmesi garanti edilmediğinden değişebilir.
C. Değerlere göre toplama
Kullanıcıların her etikete göre ürün sayısını gösteren, ürün sayısına göre sıralanmış bir rapor oluşturması ve yalnızca ikiden fazla ürün içeren etiketleri filtrelemesi gerekir.
SELECT value as tag, COUNT(*) AS [number_of_articles]
FROM Product
CROSS APPLY STRING_SPLIT(Tags, ',')
GROUP BY value
HAVING COUNT(*) > 2
ORDER BY COUNT(*) DESC;
D. Etiket değerine göre arama
Geliştiricilerin makaleleri anahtar sözcüklere göre bulayan sorgular oluşturması gerekir. Aşağıdaki sorguları kullanabilirler:
Tek etiketli (giyim) ürünleri bulmak için:
SELECT ProductId, Name, Tags
FROM Product
WHERE 'clothing' IN (SELECT value FROM STRING_SPLIT(Tags, ','));
Belirtilen iki etikete (giyim ve yol) sahip ürünleri bulun:
SELECT ProductId, Name, Tags
FROM Product
WHERE EXISTS (SELECT *
FROM STRING_SPLIT(Tags, ',')
WHERE value IN ('clothing', 'road'));
E. Değerlerin listesine göre satırları bulma
Geliştiricilerin, kimlik listesine göre makaleleri bulan bir sorgu oluşturması gerekir. Aşağıdaki sorguyu kullanabilirler:
SELECT ProductId, Name, Tags
FROM Product
JOIN STRING_SPLIT('1,2,3',',')
ON value = ProductId;
Önceki STRING_SPLIT kullanım, yaygın bir kötü modelin yerini alır. Böyle bir kötü model, uygulama katmanında veya Transact-SQL'de dinamik bir SQL dizesi oluşturmayı içerebilir. Alternatif olarak, bir kötü model işleci kullanılarak LIKE elde edilebilir. Aşağıdaki örnek SELECT deyimine bakın:
SELECT ProductId, Name, Tags
FROM Product
WHERE ',1,2,3,' LIKE '%,' + CAST(ProductId AS VARCHAR(20)) + ',%';
F. Sıralı değerlere göre satırları bulma
Aşağıdaki deyim çift dizin değerine sahip tüm satırları bulur:
SELECT *
FROM STRING_SPLIT('Austin,Texas,Seattle,Washington,Denver,Colorado', ',', 1)
WHERE ordinal % 2 = 0;
Yukarıdaki deyim aşağıdaki tabloyu döndürür:
| value | Sıralı |
|---|---|
| Texas | 2 |
| Washington | 4 |
| Colorado | 6 |
G. Sıra değerlerine göre satırları sıralama
Aşağıdaki deyim, giriş dizesinin bölünmüş alt dize değerlerini ve sütuna göre ordinal sıralanmış sıralı sıra değerlerini döndürür:
SELECT * FROM STRING_SPLIT('E-D-C-B-A', '-', 1) ORDER BY ordinal DESC;
Yukarıdaki deyim aşağıdaki tabloyu döndürür:
| value | Sıralı |
|---|---|
| A | 5 |
| B | 4 |
| C | 3 |
| D | 2 |
| E | 1 |