Wist u dat er in SQL Server 2016 een native STRING_SPLIT functie is toegevoegd? Als consultant zie ik zo veel code die een scalaire functie aanroept die wordt gebruikt om stringdelimited variabelen op te splitsen in een bruikbare lijst. Voor degenen die deze methode gebruiken, stel ik voor dat u naar deze functie kijkt. STRING_SPLIT is een tabel-getaxeerde functie die een enkele kolom van uw string-waarden teruggeeft, opgesplitst door het scheidingsteken. Dit is een ongebruikelijk stukje T-SQL, in die zin dat compatibiliteitsniveau 130 of hoger vereist is voor het gebruik ervan (Microsoft wilde geen brekende wijzigingen in bestaande gebruikerscode aanbrengen). Het gebruik van deze methode is veel efficiënter en kan worden uitgevoerd zonder een scalaire functie aan te roepen.
De syntax
STRING_SPLIT ( string , separator)
Hoe het te gebruiken
SELECT value AS 'Flavor' FROM STRING_SPLIT('Chocolate,Vanilla,Strawberry', ',');
Resultaten
Het plan
Hier ziet het plan er zo uit. Het is heel rechttoe rechtaan en eenvoudig.
Aangepaste functie
Nu volgt hier een zelfgemaakte versie die u in sommige omgevingen kunt aantreffen. U kunt zien dat deze veel minder efficiënt is.
/****** 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
De resultaten
De resultaten zijn hetzelfde. Maar let op: je veldnaam zal elke keer hetzelfde zijn, met de nieuwe functie krijg je hier iets meer flexibiliteit in.
Het plan
Het is iets ingewikkelder dan het rechttoe-rechtaan plan dat we hierboven zagen, inclusief een sequentie.
Er zijn veel verschillende manieren om een split-functie te schrijven om dingen te laten werken, maar nu SQL Server ons er een heeft gegeven, raad ik u ten zeerste aan om er eens naar te kijken. Bij performance tuning moet je kijken naar wat je altijd hebt gedaan in je code en zoeken naar manieren om het te verbeteren, zoals dit. U kunt meer leren en meer voorbeelden zien hier op docs.microsoft.com.
Contact opnemen met de auteur | Contact DCAC