Convertendo um array de string para dados de uma tabela no SQL Server


Em diversas ocasiões, precisamos converter um array de strings passados como parâmetro de uma procedure para uma tabela, nos casos que precisaríamos utilizar esse array em uma condição “IN”. Existem duas formas de se fazer isso.

1. Montando uma query do formato de texto e utilizar o sp_executesql para executar essa consulta

2. Modificando esse parâmetro para ser uma tabela e nesse caso, utilizando normalmente na sua consulta.

Nesse post, mostrarei como fazer a segunda opção.

Primeiramente, criamos uma função para transformar strings separados com algum delimitador para dados de um parâmetro do tipo TABLE.

A função para executar essa ação é a seguinte: 

CREATE FUNCTION udf_StringToTable
    (
      @ParamaterList VARCHAR(MAX),
      @Delimiter CHAR(1)
    )
       RETURNS @ReturnList TABLE
    (
      FieldValue VARCHAR(MAX)
    )
AS
BEGIN
    DECLARE
@ArrayList TABLE
        (
          FieldValue VARCHAR(MAX)
        )

    DECLARE @Value VARCHAR(MAX)
    DECLARE @CurrentPosition INT

    SET @ParamaterList = LTRIM(RTRIM(@ParamaterList)) + CASE WHEN RIGHT(@ParamaterList, 1) = @Delimiter THEN   ELSE @Delimiter END
    SET @CurrentPosition = ISNULL(CHARINDEX(@Delimiter, @ParamaterList, 1), 0) 

 
    IF @CurrentPosition = 0

        INSERT  INTO @ArrayList ( FieldValue )
                SELECT  @ParamaterList
    ELSE
        BEGIN
            WHILE
@CurrentPosition > 0
                BEGIN
                    –tenha certeza que o delimitador esta na string passada
                    SET @Value = LTRIM(RTRIM(LEFT(@ParamaterList, @CurrentPosition – 1)))

                    IF LEN(@ParamaterList) > 0 AND @CurrentPosition <= LEN(@ParamaterList)
                        BEGIN
                            INSERT  INTO
@ArrayList ( FieldValue )
                                    SELECT  @Value
                        END

                    SET @ParamaterList = SUBSTRING(@ParamaterList, @CurrentPosition + LEN(@Delimiter),  LEN(@ParamaterList))
                    SET @CurrentPosition = CHARINDEX(@Delimiter,  @ParamaterList, 1)

                END

        END

    INSERT  @ReturnList ( FieldValue )
            SELECT  FieldValue FROM    @ArrayList

    RETURN

END

Essa função faz com que você possa utilizar um array de strings em uma consulta simples, conforme o exemplo a seguir:

DECLARE @ArrayList VARCHAR(MAX)    

SET @ArrayList = ‘tim,zach,chris,wendi,brad’ 

SELECT * FROM udf_StringToTable (@ArrayList, ‘,’)

Vale lembrar que nem sempre, a utilização desse tipo de função é melhor no que diz respeito a performance.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: