none
Como criar Procedure passando nome de colunas como parametros RRS feed

  • Pergunta

  • Bom dia, Pessoal!

    criei uma procedure de consulta onde passo o nome do campo da tabela como parâmetros e valor da condição como parâmetros, porem não funciona.

    Acredito que tenha algo especifico para isso. Estou utilizando Sql Server 2008 R2.

    Segue minha procedure:

    CREATE PROCEDURE spRepresentanteConsulta
    @CampoDePesquisa as varchar(60),
    @Codigo as varchar(100)
    
    AS
    BEGIN
    	SELECT * FROM REPRESENTANTE WHERE @CampoDePesquisa = @Codigo;
    END

    Teste realizado:

    exec spRepresentanteConsulta 'Codigo','000001'

    porem o select me retorna vazio.

    Como posso fazer isso? já vi um post bem antigo porem o parâmetro era o nome da tabela e não deu certo minhas tentativas...

    Obrigado.

    Att.

    Thyago

    segunda-feira, 6 de junho de 2016 13:38

Respostas

  • Para isso voce vai ter que usar o sp_executesql  passando a string do comando, mais ou menos deste jeito:

    CREATE PROCEDURE spRepresentanteConsulta
    @CampoDePesquisa as varchar(60),
    @Codigo as varchar(100)
    
    AS
    BEGIN
    	DECLARE @SQL AS NVARCHAR(MAX);
    	SET @SQL = 'SELECT * FROM REPRESENTANTE WHERE' + @CampoDePesquisa + '=' + @Codigo +';'
    		
    	--Aqui tenho que execultar a variável @SQL.
             sp_executesql @sql
    
    END

    Att



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


    segunda-feira, 6 de junho de 2016 14:30
  • Normalmente nvarchar max

    DECLARE @sql nvarchar(max)

    Desta forma voce nao tem o problema de possiveis conversoes devido ao collation

    Att


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

    segunda-feira, 6 de junho de 2016 15:05
  • Eu disse na minha primeira resposta: com sp_executesql @sql

    ficaria deste jeito:

    CREATE PROCEDURE spRepresentanteConsulta
    @CampoDePesquisa as varchar(60),
    @Codigo as varchar(100)
    
    AS
    BEGIN
    	DECLARE @SQL AS NVARCHAR(MAX);
    	SET @SQL = 'SELECT * FROM REPRESENTANTE WHERE' + @CampoDePesquisa + '=' + @Codigo +';'
    		
    	--Aqui tenho que execultar a variável @SQL.
             sp_executesql @sql
    
    END

    Documentaçao sobre o sp_executesql

    https://msdn.microsoft.com/library/ms188001%28v=sql.120%29.aspx?f=255&MSPPError=-2147217396

    att


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


    segunda-feira, 6 de junho de 2016 15:55
  • Ok.. o problema é que o valor nao esta sendo enviado com apostrofo.. na verdade o sql que esta sendo executado é:

    SELECT * FROM REPRESENTANTE WHERE CNPJ = 12.345.678/0001-00

    Para resolver isso faça assim:

    CREATE PROCEDURE spRepresentanteConsulta
    @CampoDePesquisa as varchar(60),
    @Codigo as varchar(100)
    
    AS
    BEGIN
    	DECLARE @SQL AS NVARCHAR(MAX);
    	SET @SQL = 'SELECT * FROM REPRESENTANTE WHERE' + @CampoDePesquisa + '=''' + @Codigo +''';'
    		
    	--Aqui tenho que execultar a variável @SQL.
             sp_executesql @sql
    
    END

    att


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

    segunda-feira, 6 de junho de 2016 17:54

Todas as Respostas

  • Para isso voce vai ter que usar o sp_executesql  passando a string do comando, mais ou menos deste jeito:

    CREATE PROCEDURE spRepresentanteConsulta
    @CampoDePesquisa as varchar(60),
    @Codigo as varchar(100)
    
    AS
    BEGIN
    	DECLARE @SQL AS NVARCHAR(MAX);
    	SET @SQL = 'SELECT * FROM REPRESENTANTE WHERE' + @CampoDePesquisa + '=' + @Codigo +';'
    		
    	--Aqui tenho que execultar a variável @SQL.
             sp_executesql @sql
    
    END

    Att



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


    segunda-feira, 6 de junho de 2016 14:30
  • William,

    qual seria o tipo ideal da variável @sql ? varchar() mesmo? ou alguma especifica?

    Então vou ter que criar mais uma procedute para executar 

    Obrigado pela resposta...

    Att.

    Thyago


    segunda-feira, 6 de junho de 2016 15:02
  • Normalmente nvarchar max

    DECLARE @sql nvarchar(max)

    Desta forma voce nao tem o problema de possiveis conversoes devido ao collation

    Att


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

    segunda-feira, 6 de junho de 2016 15:05
  • William, não consegui compreender como vou executar a variável. 

    Entendi que tenho que passar a string de comando por uma variável do tipo nvarchar.

    Eu tenho que criar outra procedure para executar somente a variável?

    Eu consigo fazer tudo em uma unica procedure?

    veja só onde parei:

    CREATE PROCEDURE spRepresentanteConsulta
    @CampoDePesquisa as varchar(60),
    @Codigo as varchar(100)
    
    AS
    BEGIN
    	DECLARE @SQL AS NVARCHAR(MAX);
    	SET @SQL = 'SELECT * FROM REPRESENTANTE WHERE ' + @CampoDePesquisa + '=' + @Codigo +';'
    		
    	--Aqui tenho que execultar a variável @SQL.
    	exec ???
    END

    Att.

    Thyago



    segunda-feira, 6 de junho de 2016 15:43
  • Eu disse na minha primeira resposta: com sp_executesql @sql

    ficaria deste jeito:

    CREATE PROCEDURE spRepresentanteConsulta
    @CampoDePesquisa as varchar(60),
    @Codigo as varchar(100)
    
    AS
    BEGIN
    	DECLARE @SQL AS NVARCHAR(MAX);
    	SET @SQL = 'SELECT * FROM REPRESENTANTE WHERE' + @CampoDePesquisa + '=' + @Codigo +';'
    		
    	--Aqui tenho que execultar a variável @SQL.
             sp_executesql @sql
    
    END

    Documentaçao sobre o sp_executesql

    https://msdn.microsoft.com/library/ms188001%28v=sql.120%29.aspx?f=255&MSPPError=-2147217396

    att


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


    segunda-feira, 6 de junho de 2016 15:55
  • Para execultar a varialve @SQL fiz exec(@SQL);
    segunda-feira, 6 de junho de 2016 16:05
  • Da primeira vez que você falou no meu sql aqui não apareceu esse comando... devo ter digitado algo errado...

    Obrigado.

    segunda-feira, 6 de junho de 2016 16:23
  • William,

    obrigado pela ajuda, funcionou da maneira que você me explicou.

    Só mais uma pergunta.

    Na tabela eu tenho gravado campo CNPJ e CPF e gravo dos dados formatados ex: 12.345.678/0001-00

    e quando passo na procedure algum valor que contenha .(ponto) ele apresenta um erro de sintaxe incorreta próximo a '.678 '

    testando a procedure:

    exec spRepresentanteConsulta 'CNPJ','12.345.678/0001-00'
    

    e com uma consulta normal da certo

    SELECT * FROM REPRESENTANTE WHERE CNPJ = '12.345.678/0001-00'

    o que pode ser? alguma regra?

    Obrigado

    Thyago

    segunda-feira, 6 de junho de 2016 17:44
  • Ok.. o problema é que o valor nao esta sendo enviado com apostrofo.. na verdade o sql que esta sendo executado é:

    SELECT * FROM REPRESENTANTE WHERE CNPJ = 12.345.678/0001-00

    Para resolver isso faça assim:

    CREATE PROCEDURE spRepresentanteConsulta
    @CampoDePesquisa as varchar(60),
    @Codigo as varchar(100)
    
    AS
    BEGIN
    	DECLARE @SQL AS NVARCHAR(MAX);
    	SET @SQL = 'SELECT * FROM REPRESENTANTE WHERE' + @CampoDePesquisa + '=''' + @Codigo +''';'
    		
    	--Aqui tenho que execultar a variável @SQL.
             sp_executesql @sql
    
    END

    att


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

    segunda-feira, 6 de junho de 2016 17:54
  • Teste
    segunda-feira, 6 de junho de 2016 18:05
  • Entendi William... muito obrigado pela ajuda... e pela teoria...

    funcionou....

    segunda-feira, 6 de junho de 2016 18:14
  • Teste
    Testado :)

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

    segunda-feira, 6 de junho de 2016 18:27