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:
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”