none
Clausula IN com parâmetros RRS feed

  • Pergunta

  • Executando a seguinte query no MS SQL:

     

    SELECT     cod_lin     FROM       spi_tbL_op_dados_clpwms
    WHERE     (CAST(cod_lin AS VARCHAR(20)) IN ('22', '24'))

     

    Tenho como resultado uma apresentacao correta de todos os meus registros que possuem o campo cod_lin = '22', ou igual a '24'.

     

     

    Já, executando a seguinte query,  com parâmetros de IN :

     

    DECLARE @rpPar_Linha as VARCHAR(100)

    /*

    AQUI EMBAIXO NAO É ASPAS DUPLA, TODOS OS CARACTERES SÃO ASPAS SIMPLES!

    OBSERVE O COMANDO PRINT PARA CERTIFICAR O SEU CONTEUDO

    */
    SET @rpPar_Linha = '''22'',''24'''
    PRINT @rpPar_Linha

    SELECT     cod_lin     FROM       spi_tbL_op_dados_clpwms
    WHERE     (CAST(cod_lin AS VARCHAR(20)) IN (@rpPar_Linha))


    Tenho como resultado absolutamente nenhum registro.

     

    E, finalmente alterando apenas o SET acima para

     

    SET @rpPar_Linha = '22'

     

    Funciona perfeitamente.

     

    Alguem poderia me ajudar a montar a string correta para este parâmetro?

    Obrigado!

    quarta-feira, 4 de julho de 2007 19:11

Respostas

  •  

    Fabiano,

     

    Realmente não vai funcionar dessa maneira. Faça o seguinte, cria esta função e depois mostro como usar:

     

    Code Snippet

    CREATE FUNCTION [dbo].[fnStringToInt] (@String VARCHAR(1000))

    RETURNS @Inteiros TABLE

    (

    IDs int

    )

    AS

    BEGIN

    DECLARE @Int INT

    IF PATINDEX ('%,%', @String) = 0

    INSERT INTO @Inteiros VALUES (@String)

    ELSE

    BEGIN

    WHILE PATINDEX ('%,%', @String) > 0

    BEGIN

    INSERT INTO @Inteiros VALUES (CONVERT (INT, SUBSTRING (@String, 1, PATINDEX ('%,%', @String) - 1)))

    SET @String = SUBSTRING (@String, PATINDEX ('%,%', @String) + 1, LEN(@String))

    END

    INSERT INTO @Inteiros VALUES (@String)

    END

    RETURN

    END

     

    E assim fica o exemplo da utilização, passando apenas os valores separados por vírgula:

     

    Code Snippet

    DECLARE @rpPar_Linha as VARCHAR(100)

    SET @rpPar_Linha = '22, 24'

    PRINT @rpPar_Linha

    SELECT cod_lin FROM spi_tbL_op_dados_clpwms

    WHERE (CAST(cod_lin AS VARCHAR(20)) IN (select ids from dbo.fnStringToInt (@rpPar_Linha)))

     

    Qualquer dúvida, retorne.

     

     

    Abraço

     

    quarta-feira, 4 de julho de 2007 20:38
  • ou segue um exemplo com join ( eu acho melhor que o in por conta de performance )

     

    Abs;

     

    Create Function Uf_SplitString (@String Varchar(1000))
    Returns @RetTableString Table (String Int)
    As
    Begin
    Declare @TableString Table (String Int)
    Declare @Start Int
    Declare @End Int
    Declare @Insert Varchar(30)
    Select @Start = 1, @End = Len(@String+','), @Insert = '', @String = @String + ','
    While @Start <= @End
    Begin
    If Substring(@String,@Start,1) = ','
    Begin
    Insert Into @TableString (String) Values (@Insert)
    Set @Insert = ''
    End
    Else
    Begin
    Set @Insert = @Insert + Substring(@String,@Start,1)
    End
    Set @Start = @Start + 1
    End
    Insert Into @RetTableString (String) Select String From @TableString
    Return
    End
    Create Table #Exemplo (Campo1 int)
    Insert into #Exemplo (Campo1) Values (15)
    Insert into #Exemplo (Campo1) Values (10)
    Insert into #Exemplo (Campo1) Values (1)
    Declare @StringSequencia Varchar(1000)

    Set @StringSequencia = '10,20,30' -- pode ser um retorno de procedure ou passado via codigo mesmo.

    Select * From #Exemplo
    Inner Join (Select String From dbo.Uf_SplitString(@StringSequencia)) Tbl On Tbl.String = #Exemplo.Campo1

    quinta-feira, 5 de julho de 2007 16:44

Todas as Respostas

  •  

    Fabiano,

     

    Realmente não vai funcionar dessa maneira. Faça o seguinte, cria esta função e depois mostro como usar:

     

    Code Snippet

    CREATE FUNCTION [dbo].[fnStringToInt] (@String VARCHAR(1000))

    RETURNS @Inteiros TABLE

    (

    IDs int

    )

    AS

    BEGIN

    DECLARE @Int INT

    IF PATINDEX ('%,%', @String) = 0

    INSERT INTO @Inteiros VALUES (@String)

    ELSE

    BEGIN

    WHILE PATINDEX ('%,%', @String) > 0

    BEGIN

    INSERT INTO @Inteiros VALUES (CONVERT (INT, SUBSTRING (@String, 1, PATINDEX ('%,%', @String) - 1)))

    SET @String = SUBSTRING (@String, PATINDEX ('%,%', @String) + 1, LEN(@String))

    END

    INSERT INTO @Inteiros VALUES (@String)

    END

    RETURN

    END

     

    E assim fica o exemplo da utilização, passando apenas os valores separados por vírgula:

     

    Code Snippet

    DECLARE @rpPar_Linha as VARCHAR(100)

    SET @rpPar_Linha = '22, 24'

    PRINT @rpPar_Linha

    SELECT cod_lin FROM spi_tbL_op_dados_clpwms

    WHERE (CAST(cod_lin AS VARCHAR(20)) IN (select ids from dbo.fnStringToInt (@rpPar_Linha)))

     

    Qualquer dúvida, retorne.

     

     

    Abraço

     

    quarta-feira, 4 de julho de 2007 20:38
  • ou segue um exemplo com join ( eu acho melhor que o in por conta de performance )

     

    Abs;

     

    Create Function Uf_SplitString (@String Varchar(1000))
    Returns @RetTableString Table (String Int)
    As
    Begin
    Declare @TableString Table (String Int)
    Declare @Start Int
    Declare @End Int
    Declare @Insert Varchar(30)
    Select @Start = 1, @End = Len(@String+','), @Insert = '', @String = @String + ','
    While @Start <= @End
    Begin
    If Substring(@String,@Start,1) = ','
    Begin
    Insert Into @TableString (String) Values (@Insert)
    Set @Insert = ''
    End
    Else
    Begin
    Set @Insert = @Insert + Substring(@String,@Start,1)
    End
    Set @Start = @Start + 1
    End
    Insert Into @RetTableString (String) Select String From @TableString
    Return
    End
    Create Table #Exemplo (Campo1 int)
    Insert into #Exemplo (Campo1) Values (15)
    Insert into #Exemplo (Campo1) Values (10)
    Insert into #Exemplo (Campo1) Values (1)
    Declare @StringSequencia Varchar(1000)

    Set @StringSequencia = '10,20,30' -- pode ser um retorno de procedure ou passado via codigo mesmo.

    Select * From #Exemplo
    Inner Join (Select String From dbo.Uf_SplitString(@StringSequencia)) Tbl On Tbl.String = #Exemplo.Campo1

    quinta-feira, 5 de julho de 2007 16:44
  • Alexandre,

     

    Muito obrigado pela força.

     

    Abraço!

     

    Fabiano

    quinta-feira, 5 de julho de 2007 19:06
  • Obrigado Marcelo,

    Valeu pela dica sobre a performance.

    Abraço

    quinta-feira, 5 de julho de 2007 19:07