none
Procedure RRS feed

  • Pergunta

  • Galera preciso fazer uma procedure e nessa procedure preciso passar como parametro um array com vários itens, por exemplo:
    select * from tabela where cod in (1,2,3,4,5)
    Preciso passar um array que minha procedure entenda esses codigos. Como eu posso fazer isso?

    SirSmart
    sexta-feira, 20 de novembro de 2009 21:55

Respostas

  • Opa, blz?

    Assim, no SQL Server 2008 você tem a possibilidade de trabalhar com as "Table Valued Parameters"(http://msdn.microsoft.com/en-us/library/bb510489.aspx), que permite trabalhar com um tipo de Array.

    Agora, se você não está usando o 2008, terá que implementar um Array "na mão". Tenho uma Function que pode lhe auxiliar. Segue o código de criação da mesma e abaixo passarei exemplo de utilização dela:

    CREATE FUNCTION [dbo].[fnStringToInt] (@String VARCHAR(1000), @Separador CHAR(1))
    RETURNS @Inteiros TABLE (IDs int)
    AS
    BEGIN
    	DECLARE @Int INT
    	IF PATINDEX ('%' + @Separador + '%', @String) = 0
    		INSERT INTO @Inteiros VALUES (@String)
    	ELSE
    	BEGIN
    		WHILE PATINDEX ('%' + @Separador + '%', @String) > 0
    		BEGIN
    			INSERT INTO @Inteiros VALUES (CONVERT (INT, SUBSTRING (@String, 1, PATINDEX ('%' + @Separador + '%', @String) - 1)))
    			SET @String = SUBSTRING (@String, PATINDEX ('%' + @Separador + '%', @String) + 1, LEN(@String))
    		END
    		INSERT INTO @Inteiros VALUES (@String)
    	END
    	RETURN
    END

    A idéia dessa function, é receber uma lista de valores, e montar um "Array" (na verdade monta uma table, mas dá pra usar como um array, hehe).

    Execute primeiro a function sozinha, para ver como ela se comporta:

    DECLARE @Valores VARCHAR (100), @Separador VARCHAR (100)
    SET @Valores = '1,2,3,4,5'
    SET @Separador = ','
    SELECT IDs FROM [dbo].[fnStringToInt] (@Valores, @Separador)
    Veja que você passa como parâmetro a sequencia de itens que serão retornados como sendo uma String, e mais o separador que está sendo usado.

    Agora, vejo como você pode usar no primeiro SELECT que você mandou como exemplo:

    DECLARE @Valores VARCHAR (100), @Separador VARCHAR (100)
    SET @Valores = '1,2,3,4,5'
    SET @Separador = ','
    
    SELECT * FROM tabela
    WHERE cod in (SELECT IDs FROM [dbo].[fnStringToInt] (@Valores, @Separador))
    

    Bom, restando dúvidas, retorne.


    Abraço!!





    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    • Sugerido como Resposta Alexandre VM segunda-feira, 23 de novembro de 2009 16:59
    • Marcado como Resposta Fernanda Simões terça-feira, 24 de novembro de 2009 13:03
    segunda-feira, 23 de novembro de 2009 12:11

Todas as Respostas

  • Quando vc diz passar um array, vc se refere a um array criado em c# ou vb, por exemplo?

    Att

    William John Adam Trindade
    Analyste-programmeur
    ----------------------------------------------------------

    SOGI INFORMATIQUE LTÉE (http://www.sogi.com)
    sábado, 21 de novembro de 2009 05:00
  • Bom Dia,

    O SQL Server não tem um tipo "array", mas existem várias formas de fazê-lo.
    Essa dúvida já foi muito debatida no fórum e uma pesquisa prévia pelas palavras array, arrays, vetor, vetores, split, etc irá lhe mostrar várias soluções.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!814.entry
    Classifique as respostas. O seu feedback é imprescindível
    sábado, 21 de novembro de 2009 11:31
  • Isso, em C# ou VB

    Abs
    SirSmart
    sábado, 21 de novembro de 2009 21:49
  • Opa, blz?

    Assim, no SQL Server 2008 você tem a possibilidade de trabalhar com as "Table Valued Parameters"(http://msdn.microsoft.com/en-us/library/bb510489.aspx), que permite trabalhar com um tipo de Array.

    Agora, se você não está usando o 2008, terá que implementar um Array "na mão". Tenho uma Function que pode lhe auxiliar. Segue o código de criação da mesma e abaixo passarei exemplo de utilização dela:

    CREATE FUNCTION [dbo].[fnStringToInt] (@String VARCHAR(1000), @Separador CHAR(1))
    RETURNS @Inteiros TABLE (IDs int)
    AS
    BEGIN
    	DECLARE @Int INT
    	IF PATINDEX ('%' + @Separador + '%', @String) = 0
    		INSERT INTO @Inteiros VALUES (@String)
    	ELSE
    	BEGIN
    		WHILE PATINDEX ('%' + @Separador + '%', @String) > 0
    		BEGIN
    			INSERT INTO @Inteiros VALUES (CONVERT (INT, SUBSTRING (@String, 1, PATINDEX ('%' + @Separador + '%', @String) - 1)))
    			SET @String = SUBSTRING (@String, PATINDEX ('%' + @Separador + '%', @String) + 1, LEN(@String))
    		END
    		INSERT INTO @Inteiros VALUES (@String)
    	END
    	RETURN
    END

    A idéia dessa function, é receber uma lista de valores, e montar um "Array" (na verdade monta uma table, mas dá pra usar como um array, hehe).

    Execute primeiro a function sozinha, para ver como ela se comporta:

    DECLARE @Valores VARCHAR (100), @Separador VARCHAR (100)
    SET @Valores = '1,2,3,4,5'
    SET @Separador = ','
    SELECT IDs FROM [dbo].[fnStringToInt] (@Valores, @Separador)
    Veja que você passa como parâmetro a sequencia de itens que serão retornados como sendo uma String, e mais o separador que está sendo usado.

    Agora, vejo como você pode usar no primeiro SELECT que você mandou como exemplo:

    DECLARE @Valores VARCHAR (100), @Separador VARCHAR (100)
    SET @Valores = '1,2,3,4,5'
    SET @Separador = ','
    
    SELECT * FROM tabela
    WHERE cod in (SELECT IDs FROM [dbo].[fnStringToInt] (@Valores, @Separador))
    

    Bom, restando dúvidas, retorne.


    Abraço!!





    Classifiquem as respostas. O Fórum agradece!! This posting is provided "AS IS" with no warranties, and confers no rights.
    • Sugerido como Resposta Alexandre VM segunda-feira, 23 de novembro de 2009 16:59
    • Marcado como Resposta Fernanda Simões terça-feira, 24 de novembro de 2009 13:03
    segunda-feira, 23 de novembro de 2009 12:11
  • Olá SirSmart,

    O exemplo do Alexandre é bem interessante (eu inclusive o "copiei" no meu blog), mas há muitas outras soluções interessantes e com menos código usando XML, CLR, etc. Se você fizer uma busca prévia no fórum você as encontrará.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    A Impedância, o Mapeamento Objeto Relacional e Implementações – Parte II
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!814.entry
    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 24 de novembro de 2009 10:29