Muitas vezes, me deparo com o problema de ter uma lista de valores (contida numa string, por exemplo) e querer utilizá-la como registros de uma tabela, talvez para fazer join com alguma outra tabela ou coisa assim. Se essa necessidade ocorrer dentro de uma PROC, poderíamos criar uma tabela temporária, abastecê-la com os registros desejados, fazer uso da forma que desejarmos e depois apagá-la. Já numa VIEW não temos como criar objetos, apenas os consultamos, ou numa rotina dentro de um programa, as limitações seriam semelhantes.
Foi pensando nisso que eu dei uma estudada e cheguei no script abaixo. Ele cria na base de dados uma FUNCTION que recebe por parâmetro uma string contendo a lista de valores e outro contendo o caractere usado como separador na lista e retorna uma tabela com uma coluna e os diversos valores em forma de registros. Vamos ao script:
|
CREATE FUNCTION dbo.GetTableFromString
(
@Valores VarChar(4000),
@Separador Char(1)
)
RETURNS @Retorno TABLE( Valor VarChar(256) )
BEGIN
DECLARE @PosIni INT, @PosFim INT
SELECT
@PosIni = 1,
@PosFim = CharIndex(@Separador, @Valores)
WHILE @PosIni < Len(@Valores) + 1 BEGIN
IF @PosFim = 0 BEGIN
SET @PosFim = Len(@Valores) + 1
END
INSERT INTO @Retorno (Valor)
VALUES( SUBSTRING(@Valores, @PosIni, @PosFim - @PosIni) )
SET @PosIni = @PosFim + 1
SET @PosFim = CharIndex(@Separador, @Valores, @PosIni)
END
RETURN
END
|
Supondo que temos a seguinte lista: 'azul|verde|branco|preto', podemos ver que os valores são separados pelo caractere: '|' ou seja, faríamos a chamada da função da seguinte forma:
|
SELECT * FROM dbo.GetTableFromString('azul|verde|branco|preto', '|')
|
E o retorno seria:
|
Valor
-------------------
azul
verde
branco
preto
(6 row(s) affected)
|
po-po-por hoje é só pe-pe-pessoal... até a próxima