Ennesimo elemento in una stringa in T-SQL

Chi bazzica Business Central guardando dentro le tabelle del database, avrà notato che vengono spesso utilizzati dei campi “opzione”; in pratica il campo lato applicativo è rappresentato da un elenco valori, che viene salvato nel DB come un indice posizionale base zero.

L’elenco dei valori è, lato ambiente di sviluppo, rappresentato da un’unica stringa dove i valori sono separati da virgole:

Visual Studio Code, linguaggio AL
Ambiente Classic, opzioni del campo

Dovendo fare delle viste sul DB che “convertano” questo valore numerico in un valore stringa, si può utilizzare la seguente funzione:

ALTER FUNCTION ElemInString(@STR VARCHAR(255), @DELIM VARCHAR(1), @optIndex int)
RETURNS VARCHAR(100)
BEGIN
	SET @DELIM = COALESCE(@DELIM,',');

	DECLARE @curLoop int = 0;

	DECLARE @lastPos int = 0;
	DECLARE @pos int;
	SET @pos = CHARINDEX(@DELIM,@STR,@lastPos);

	DECLARE @Res VARCHAR(100) = '#ERR';

	while (@pos > 0) and (@curLoop <= @optIndex)
	begin
		if @curLoop = @optIndex
			SET @Res = substring(@STR,@lastPos + 1, @pos - @lastPos - 1);
		set @lastPos = @pos;
		SET @pos = CHARINDEX(@DELIM,@STR,@lastPos + 1);

		SET @curLoop = @curLoop + 1;
	end;

	if (@curLoop = @optIndex) and (@lastPos < len(@STR))
		SET @Res = substring(@STR,@lastPos + 1,9999);

	RETURN @Res;
END;

La funzione può essere utilizzata nelle viste come di seguito:

SELECT dbo.ElemInString(',aaa,bbb,ccc,ddd', ',', 3)

Nel caso specifico restituisce la stringa “ccc”