Usuário com melhor resposta
Como criar Procedure passando nome de colunas como parametros

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
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
----------------------------------------------------------
- Sugerido como Resposta William John Adam Trindade segunda-feira, 6 de junho de 2016 17:17
- Editado William John Adam Trindade segunda-feira, 6 de junho de 2016 17:18
- Marcado como Resposta Thales F Quintas segunda-feira, 6 de junho de 2016 17:47
-
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
----------------------------------------------------------
- Marcado como Resposta Thyago Gonçalves segunda-feira, 6 de junho de 2016 18:15
-
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
----------------------------------------------------------
- Editado William John Adam Trindade segunda-feira, 6 de junho de 2016 15:58
- Marcado como Resposta Thyago Gonçalves segunda-feira, 6 de junho de 2016 18:14
-
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
----------------------------------------------------------
- Marcado como Resposta Thyago Gonçalves segunda-feira, 6 de junho de 2016 18:14
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
----------------------------------------------------------
- Sugerido como Resposta William John Adam Trindade segunda-feira, 6 de junho de 2016 17:17
- Editado William John Adam Trindade segunda-feira, 6 de junho de 2016 17:18
- Marcado como Resposta Thales F Quintas segunda-feira, 6 de junho de 2016 17:47
-
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
- Editado Thyago Gonçalves segunda-feira, 6 de junho de 2016 15:10
-
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
----------------------------------------------------------
- Marcado como Resposta Thyago Gonçalves segunda-feira, 6 de junho de 2016 18:15
-
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
- Editado Thyago Gonçalves segunda-feira, 6 de junho de 2016 16:04
-
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
----------------------------------------------------------
- Editado William John Adam Trindade segunda-feira, 6 de junho de 2016 15:58
- Marcado como Resposta Thyago Gonçalves segunda-feira, 6 de junho de 2016 18:14
-
-
-
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
-
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
----------------------------------------------------------
- Marcado como Resposta Thyago Gonçalves segunda-feira, 6 de junho de 2016 18:14
-
-
-
Teste
Testado :)William John Adam Trindade
Analyste-programmeur
----------------------------------------------------------