none
Procedure Dinâmica diferente RRS feed

  • Pergunta

  • Pessoal,
    É o seguinte preciso fazer uma proc. que selecione os idEmpresas passados como parametros, exemplo: "usp_minhaproc_select_empresa 1,2,3...N",

    mais não sei como fazer para que aceite os parametros, pois estou criando minha procedure da seguinte forma:

    usp_minhaproc_select_empresa @idEmpresa int
    as

    select * from tb_testeEmpresa

    where idEmpresa in (@idEmpresa)

    Não está funcionando, alguem poderia me ajudar?

    Obrigado

    segunda-feira, 28 de maio de 2012 20:36

Respostas

  • Você pode criar um função que tera objetivo receber um valor delimitado (1,2,3,4,5,6) e fazer a sua consulta usando de JOIN com a mesma, exemplo:

    CREATE FUNCTION SplitID
    (
      @IDString VARCHAR(1000)
    )
    RETURNS @IDs TABLE
    (ID INT)
    AS
    BEGIN
     DECLARE @Position int
     WHILE len(@IDString) > 0
       BEGIN
         SET @Position = charindex(',', @IDString)
         IF @Position > 0
           begiN
             INSERT @IDs
             SELECT CONVERT(INT, LEFT(@IDString, @Position - 1))
             SET @IDString = RIGHT(@IDString, LEN(@IDString) - @Position)
           END
         ELSE
           BEGIN
             INSERT @IDs
             SELECT CONVERT(INT, @IDString)
             SET @IDString = ''
           END
       END
    RETURN
    END

    SQL
    DECLARE @EmpresaIDs VARCHAR(2000)
    SET @EmpresaIDs = '1, 2, 3, 4, 5'
    SELECT E.*
    FROM Empresas E
    INNER JOIN SplitIDString(@EmpresaIDs) I
    ON E.Empresa = I.ID 

    Referencia:
    http://p2p.wrox.com/sql-server-2000/37871-passing-clause-stored-procedure.html


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    segunda-feira, 28 de maio de 2012 20:57

Todas as Respostas

  • Chilipi_10,

    Veja este exemplo:

    Create Procedure P_Valores @MeusValores Varchar(100)
    As
    Begin
     Set NoCount On
    
     Declare @Comando Varchar(1000)
     Set @Comando= 'Declare @Tabela Table (Nomes Varchar(50))
    
     Insert Into @Tabela Values(''Pedro''),(''Fernanda''),(''Eduardo'')
    
     Select * from @Tabela Where Nomes In ('+@MeusValores+')'
     Exec(@Comando)
    End
    
    
     Declare @Valores Varchar(100)
     Set @Valores = '''Pedro'''+','+'''Fernanda'''+','+'''Eduardo'''
     
    Exec P_Valores @Valores


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 28 de maio de 2012 20:50
  • Você pode criar um função que tera objetivo receber um valor delimitado (1,2,3,4,5,6) e fazer a sua consulta usando de JOIN com a mesma, exemplo:

    CREATE FUNCTION SplitID
    (
      @IDString VARCHAR(1000)
    )
    RETURNS @IDs TABLE
    (ID INT)
    AS
    BEGIN
     DECLARE @Position int
     WHILE len(@IDString) > 0
       BEGIN
         SET @Position = charindex(',', @IDString)
         IF @Position > 0
           begiN
             INSERT @IDs
             SELECT CONVERT(INT, LEFT(@IDString, @Position - 1))
             SET @IDString = RIGHT(@IDString, LEN(@IDString) - @Position)
           END
         ELSE
           BEGIN
             INSERT @IDs
             SELECT CONVERT(INT, @IDString)
             SET @IDString = ''
           END
       END
    RETURN
    END

    SQL
    DECLARE @EmpresaIDs VARCHAR(2000)
    SET @EmpresaIDs = '1, 2, 3, 4, 5'
    SELECT E.*
    FROM Empresas E
    INNER JOIN SplitIDString(@EmpresaIDs) I
    ON E.Empresa = I.ID 

    Referencia:
    http://p2p.wrox.com/sql-server-2000/37871-passing-clause-stored-procedure.html


    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/


    segunda-feira, 28 de maio de 2012 20:57
  • Valeu pessoal!

    Fiz os dois exemplos com calma e o segundo foi muito util obrigado ae galera pela ajuda.

    Abraços

    • Editado chilipi_10 quarta-feira, 30 de maio de 2012 03:09
    segunda-feira, 28 de maio de 2012 21:25