Czy wiesz, że natywna funkcja STRING_SPLIT wbudowana w SQL Server została dodana w SQL Server 2016? Jako konsultant widzę tak wiele kodu, który wywołuje się do funkcji skalarnej, które są używane do podziału zmiennych delimitowanych ciągiem na użyteczną listę. Dla tych, którzy używają tej metody, sugeruję, abyś spojrzał na tę funkcję. STRING_SPLIT to funkcja wartościowana tabelarycznie, która zwraca pojedynczą kolumnę twoich wartości łańcuchowych podzielonych przez ogranicznik. Jest to nietypowa część T-SQL, ponieważ do jej użycia wymagany jest poziom zgodności 130 lub wyższy (Microsoft nie chciał wprowadzać zmian w istniejącym kodzie użytkownika). Użycie tej metody jest o wiele bardziej wydajne i może być wykonane bez wywoływania funkcji skalarnej.

Składnia

STRING_SPLIT ( string , separator)

Jak z tego korzystać

SELECT value AS 'Flavor' FROM STRING_SPLIT('Chocolate,Vanilla,Strawberry', ',');

Wyniki

Plan

Oto jak wygląda plan. Jest on bardzo prosty i nieskomplikowany.

Funkcja własna

Teraz jest to domowa wersja, którą można spotkać w niektórych środowiskach. Możesz zobaczyć, że jest ona znacznie mniej wydajna.

/****** Object: UserDefinedFunction . Script Date: 2/11/2020 6:26:45 PM ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER FUNCTION .( @sInputList VARCHAR(8000) -- List of delimited items , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items) RETURNS @List TABLE (item VARCHAR(8000))BEGINDECLARE @sItem VARCHAR(8000)WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0 BEGIN SELECT @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))), @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList)))) IF LEN(@sItem) > 0 INSERT INTO @List SELECT @sItem ENDIF LEN(@sInputList) > 0 INSERT INTO @List SELECT @sInputList -- Put the last item inRETURNEND

Wyniki

Wyniki są takie same. Ale zauważ, że nazwa Twojego pola będzie taka sama za każdym razem, z nową funkcją otrzymasz trochę więcej elastyczności w tym zakresie.

Plan

Jest to trochę bardziej skomplikowane niż proste rozwiązanie, które widzieliśmy powyżej, w tym sekwencja.

Istnieje wiele różnych sposobów na napisanie funkcji dzielenia, aby wszystko działało, jednak teraz, gdy SQL Server dał nam jedną, gorąco zachęcam do przyjrzenia się jej. W przypadku strojenia wydajności, upewnij się, że spojrzałeś na to, co zawsze robiłeś w swoim kodzie i poszukaj sposobów na jego ulepszenie, takich jak ten. Możesz dowiedzieć się więcej i zobaczyć więcej przykładów tutaj na docs.microsoft.com.

Skontaktuj się z autorem | Skontaktuj się z DCAC

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *