none
Passagem de parametro com in RRS feed

  • Pergunta

  • Olá Pessoal!

     

    Tenho um select em uma precedure com a seguinte condição:

     

    where codigo in(@codigo)

     

    O problema é que essa variável é do tipo char e vem com os códigos agrupados: 1,2,3,78,145

     

    Quando vou executar: exec nome_procedure '1,2,3,78,145'

     

    A procedure dá erro de conversão de inteiro para char.

     

    Algém tem alguma sugestão????

     

    Obrigada

    segunda-feira, 19 de maio de 2008 18:03

Respostas

  • Olá Tassiana,

     

    Essa dúvida é recorrente aqui no fórum. Você poderá encontrar muitas informações sobre soluções em posts anteriores (uma das opções é fazer um split). Opcionalmente você pode usar uma SQL dinâmica. Ex:

     

    DECLARE @cmdSQL NVARCHAR(200)

    SET @cmdSQL = 'SELECT QualquerCoisa FROM AlgumObjeto WHERE Codigo IN (' + @codigo + ')'

    EXEC sp_executesql @statement = @cmdSQL

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 19 de maio de 2008 18:06

Todas as Respostas

  • Olá Tassiana,

     

    Essa dúvida é recorrente aqui no fórum. Você poderá encontrar muitas informações sobre soluções em posts anteriores (uma das opções é fazer um split). Opcionalmente você pode usar uma SQL dinâmica. Ex:

     

    DECLARE @cmdSQL NVARCHAR(200)

    SET @cmdSQL = 'SELECT QualquerCoisa FROM AlgumObjeto WHERE Codigo IN (' + @codigo + ')'

    EXEC sp_executesql @statement = @cmdSQL

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 19 de maio de 2008 18:06
  • Gustavo,

     

    É verdade, sendo que esta variável código poderá contar todos os valores referentes ao parâmetro.

    segunda-feira, 19 de maio de 2008 18:12
  • Cara Tassiana,

     

    Segue uma função para separar um array,

     

    Code Snippet

    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS OFF
    GO


    CREATE FUNCTION FN_RETORNA_ARRAY
     ( @ARRAY VARCHAR(1000) )
    RETURNS @TB_ARRAY TABLE
     (ITEM VARCHAR(40))
    AS
    BEGIN

     DECLARE @C INT

     SELECT @C = PATINDEX('%,%',@ARRAY)

     IF @C = 0
     BEGIN
     INSERT INTO @TB_ARRAY VALUES(@ARRAY)
     RETURN
     END

     WHILE @C <> 0
     BEGIN
      INSERT INTO @TB_ARRAY
      SELECT SUBSTRING(@ARRAY,1,PATINDEX('%,%',@ARRAY)-1)
       
      SELECT @ARRAY = SUBSTRING(@ARRAY,PATINDEX('%,%',@ARRAY)+1,LEN(@ARRAY)-PATINDEX('%,%',@ARRAY))
     
      SELECT @C = PATINDEX('%,%',@ARRAY)
     END

     INSERT @TB_ARRAY VALUES(@ARRAY)
     
     RETURN
    END


    GO
    SET QUOTED_IDENTIFIER OFF
    GO
    SET ANSI_NULLS ON
    GO

     

     

     

    Basta alterar seu where da seguinte maneira.

     

    Where codigo in ( select * from dbo.FN_RETORNA_ARRAY(@CODIGO))

     

    Espero que tenha ajudado.

     

    []'s

     

    Rafael Krisller

    segunda-feira, 19 de maio de 2008 19:03
  •  

    Tassiana Rugoni

     

    Você pode tentar da seguinte forma

     

    sua variavel que recebe é um char, dai vc faz o seguinte


    create nome_procedure

    @codigo char(tamanho) --> Eu trocaria pra varchar(xxx)

    with recompile

    as

    begin

    Set @codigo = ',' + convert(varchar(tamanho), @codigo) + ','

     

    --> dai ele teria o seguinte valor ",1,2,3,78,145,"

     

    Select  * from tabela

     where charindex(',' + convert(varchar, codigo) + ',' ,  @codigo) > 0

    end

     

    Wander Junior

    wander_luz@hotmail.com



    • Sugerido como Resposta Wander luz terça-feira, 10 de novembro de 2009 02:36
    segunda-feira, 19 de maio de 2008 19:05
  • Olá Wander,

     

    Sua solução parece ser interessante mas você já a testou para grandes volumes de dados ? Acredito que o fato dela ter um predicado pouco convencional usando o CHARINDEX irá denegrir o desempenho uma vez que nenhum índice poderá satisfazê-la. As demais soluções podem usufruir de um índice na coluna codigo

     

    [ ]s,

     

    Gustavo

     

    segunda-feira, 19 de maio de 2008 19:39
  • Bom Dia Gustavo !!!

     

    Atualmente o nosso sistema roda muito bem..., temos no sistema uma tabela com 18 Milhões de Registros e mais de 200 usuarios conectados ao mesmo tempo. Nunca testamos esse tipo de consulta na WEB, pois estamos começando a desenvolver algumas funcionalidade pra WEB, agora.

     

     

    Não saberia te dizer com seria a perfomace na WEB, mas client/server todos os tipos de testes já foram feitos.

     

     

    Tbem temos um sistema que calcula a folha de pagamento do Governo do Estado Rondonia, onde são mais de 62 mil funcionários, não sei te dizer exatamente, mas com certeza são mais de 18 milhoes de linhas no financeiro.

     

     

    Wander Junior

    wander_luz@hotmail.com

    • Sugerido como Resposta Wander luz terça-feira, 10 de novembro de 2009 02:37
    terça-feira, 20 de maio de 2008 13:05
  • se for sql 2005 eu acho que uma variavel xml pode ficar bem melhor, mais tenho outro exemplo de array diferente, que nao e dos mais performaticos mais funciona bem ...

     

    segue

     

    CREATE  Function Ufn_TableArray (@VarArray Varchar(8000))
    Returns @TableArray Table (Item varchar(50)) AS
    BEGIN
       
         If @VarArray Is null
             INSERT INTO @TableArray (Item) VALUES (Null) 
        
         Declare @Indice      AS TinyInt
         Declare @IndiceArray AS TinyInt
         Declare @VarAcum     AS nvarchar(10)

         SET @VarArray = @VarArray + ','
         SET @VarAcum = ''
         SET @Indice = 1
         SET @IndiceArray = 0

         WHILE @Indice <= Len(@VarArray)
         BEGIN
      IF Substring(@VarArray,@Indice,1) = ','
      BEGIN
          INSERT INTO @TableArray (Item) VALUES (@VarAcum)
                 SET @VarAcum = ''
        END
      ELSE
      BEGIN
          SET @VarAcum = rtrim(Convert(char(10),@VarAcum)) + rtrim(convert(char(10),Substring(@VarArray,@Indice,1)))
      END
      SET @Indice = @Indice+1
         END

    RETURN
    END


     

     

    Abs;

     

    terça-feira, 20 de maio de 2008 15:02
  •  Wander Junior wrote:

     

    Tassiana Rugoni

     

    Você pode tentar da seguinte forma

     

    sua variavel que recebe é um char, dai vc faz o seguinte


    create nome_procedure

    @codigo char(tamanho) --> Eu trocaria pra varchar(xxx)

    with recompile

    as

    begin

    Set @codigo = ',' + convert(varchar(tamanho), @codigo) + ','

     

    --> dai ele teria o seguinte valor ",1,2,3,78,145,"

     

    Select  * from tabela

     where charindex(',' + convert(varchar, codigo) + ',' ,  @codigo) > 0

    end

     

    Wander Junior

    wander_luz@hotmail.com





    Solução perfeita essa do Wander Smile
    Simples e direta.
    Parabéns! Funcionou perfeitamente aqui.
    Um abraço,
    Alexey
    segunda-feira, 16 de junho de 2008 20:32
  • outro exemplo

     

    -- create table #Exemplo  (campo int)
    insert into #Exemplo (campo) Values (1)
    insert into #Exemplo (campo) Values (2)
    insert into #Exemplo (campo) Values (4)

     

    Declare @Find Varchar(1000)
    Select @Find = '[125]'
    Select * From #Exemplo where PatIndex('%'+@Find+'%',Convert(Varchar(02),campo))>0

     

    terça-feira, 17 de junho de 2008 10:48