Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

MarKteus

Essa instrução ñ funciona. Pq ?

Recommended Posts

declare @idclienteint

declare @cpf        varchar(20)

declare @nome       varchar(20)

declare @cond_Where varchar(200)

set @cond_Where = ''

set @idcliente  = null

set @cpf        = null

set @nome       = 'JOSE'

begin

   if @nome is not null

       set @cond_Where = 'ent.strnome = @nome AND cli.nome_razao_cliente = @nome'

   else

       set @cond_Where = 'cli.id_cliente=962751'

end

 

select

cpf_cnpj_cliente,

   *

from

   cliente.cli (nolock)

inner join

   endereco_entrega_cliente.ent (nolock)

on

   cli.id_cliente = ent.id_cliente

where @cond_Where

Compartilhar este post


Link para o post
Compartilhar em outros sites

acusou algum erro ou apenas nao fez o que esperava?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim:

 

declare @idcliente int,
	  @cpf		varchar(20),
	  @nome	   varchar(20),
	  @cond_Where varchar(200),
	  @SQL varchar(8000)

   set @cond_Where = ''
   set @idcliente  = null
   set @cpf		= null
   set @nome	   = 'JOSE'

   if @nome is not null
	   set @cond_Where = ' ent.strnome = @nome AND cli.nome_razao_cliente = @nome'
   else
	   set @cond_Where = ' cli.id_cliente=962751'

   set @SQL = ' select cpf_cnpj_cliente, * '
   set @SQL =  @SQL + ' from cliente cli with (nolock) 
   set @SQL =  @SQL + ' inner join endereco_entrega_cliente ent with (nolock) on cli.id_cliente = ent.id_cliente '
   set @SQL =  @SQL + ' where ' + @cond_Where

   Exec(@SQL)

Compartilhar este post


Link para o post
Compartilhar em outros sites

acusou algum erro ou apenas nao fez o que esperava?

 

Acusou o erro abaixo

Server: Msg 4145, Level 15, State 1, Line 25

An expression of non-boolean type specified in a context where a condition is expected, near '@cond_Where'.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tente assim:

 

declare @idcliente int,
	  @cpf		varchar(20),
	  @nome	   varchar(20),
	  @cond_Where varchar(200),
	  @SQL varchar(8000)

   set @cond_Where = ''
   set @idcliente  = null
   set @cpf		= null
   set @nome	   = 'JOSE'

   if @nome is not null
	   set @cond_Where = ' ent.strnome = @nome AND cli.nome_razao_cliente = @nome'
   else
	   set @cond_Where = ' cli.id_cliente=962751'

   set @SQL = ' select cpf_cnpj_cliente, * '
   set @SQL =  @SQL + ' from cliente cli with (nolock) 
   set @SQL =  @SQL + ' inner join endereco_entrega_cliente ent with (nolock) on cli.id_cliente = ent.id_cliente '
   set @SQL =  @SQL + ' where ' + @cond_Where

   Exec(@SQL)

 

Fiz o teu exemplo e obtive os erros a seguir :

Server: Msg 207, Level 16, State 1, Line 1

Invalid column name 'JOSE'.

Server: Msg 207, Level 16, State 1, Line 1

Invalid column name 'JOSE'.

Compartilhar este post


Link para o post
Compartilhar em outros sites

MarKteus

 

Qual a versão do SQL Server que você está utilizando? Estou perguntando pq você está utilizando um hint na clausula FROM. No caso, nolock.

 

Se você estiver utilizando a versão 2005, tente colocar "from cliente with (nolock)".

 

Também é necessário retirar um ponto "." no nome tabela. ok?

Compartilhar este post


Link para o post
Compartilhar em outros sites

MarKteus

 

Qual a versão do SQL Server que você está utilizando? Estou perguntando pq você está utilizando um hint na clausula FROM. No caso, nolock.

 

Se você estiver utilizando a versão 2005, tente colocar "from cliente with (nolock)".

 

Também é necessário retirar um ponto "." no nome tabela. ok?

 

Versão 2000

Compartilhar este post


Link para o post
Compartilhar em outros sites

select

cpf_cnpj_cliente,

   *

from

   cliente.cli (nolock)

inner join

   endereco_entrega_cliente.ent (nolock)

on

   cli.id_cliente = ent.id_cliente

where @cond_Where[/size][/font]

MarKteus

 

Olhando melhor a query, notei que você não vai conseguir executar dessa forma, pois é necessário algumas correções.

 

1. Adicione o select na varíavel depois faça a concatenação com as condições do where.

2. É necessário concatenar a variável @nome. Do jeito que está a query o SQL Server não vai entender o valor da variável.

3. Utilize exec @sql para executar a instrução por completo.

4. Não é necessário o begin antes do if e nem do end após a condição.

 

Por exemplo:

 

declare @idclienteint

declare @cpf varchar(20)

declare @nome varchar(20)

declare @cond_Where varchar(200)

set @cond_Where = ''

set @idcliente = null

set @cpf = null

set @nome = 'JOSE'

 

set @sql = 'select campos from tabela (nolock) ';

 

if condicao then

set @sql = @sql + ' where nome = ''' + @nome + ''''

 

exec @sql;

 

[]'s

 

Fernando Silveira

Compartilhar este post


Link para o post
Compartilhar em outros sites

declare @idclienteint

declare @cpf        varchar(20)

declare @nome       varchar(20)

declare @cond_Where varchar(200)

set @cond_Where = ''

set @idcliente  = null

set @cpf        = null

set @nome       = 'JOSE'

begin

   if @nome is not null

       set @cond_Where = 'ent.strnome = @nome AND cli.nome_razao_cliente = @nome'

   else

       set @cond_Where = 'cli.id_cliente=962751'

end

 

select

cpf_cnpj_cliente,

   *

from

   cliente.cli (nolock)

inner join

   endereco_entrega_cliente.ent (nolock)

on

   cli.id_cliente = ent.id_cliente

where @cond_Where

Caro Fernando

 

realizado as devidas alterações restou a seguinte msg de erro

 

Server: Msg 137, Level 15, State 2, Line 5

Must declare the scalar variable "@nome".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Markteus

 

Provavelmente você executou somente o bloco de instrução onde está localizado o select. Pois a variavel @nome está declarada mais acima.

 

[]'s

 

Fernando Silveira

Fernando

 

Fiz como mostrado abaixo e mesmo assim recebi a msg erro:

 

Server: Msg 102, Level 15, State 1, Line 18

Incorrect syntax near '+ @nome +'.

 

declare @idcliente int

declare @sql varchar(500)

declare @cpf varchar(20)

declare @nome varchar(20)

declare @cond_Where varchar(200)

set @cond_Where = ''

set @idcliente = null -- 962751

set @cpf = null -- 962751

set @nome = 'JOSE'

 

set @sql = 'select * from cliente cli (nolock)

inner join

endereco_entrega_cliente ent (nolock)

on

cli.id_cliente = ent.id_cliente'

 

if @nome is not null

set @sql = @sql + ' where ent.strnome ='"+ @nome +"' AND cli.nome_razao_cliente = '"+ @nome +"

else

set @sql = @sql + ' where cli.id_cliente = 962751'

exec @sql

:unsure:

Compartilhar este post


Link para o post
Compartilhar em outros sites

MarKteus, não se usa aspas duplas como você pôs antes do + @nome, e sim aspas simples... outra coisa.... se quer pesquisar pelo nome ou pela razão social, não se usa and, e sim or... senão só retornará se achar nos dois campos o mesmo nome. E, por último...vai sempre passar o nome completo ou vai usar pesquisa parcial? Se for parcial, usasse o like.

 

Tente assim:

 

declare @idcliente int
declare @sql varchar(500)
declare @cpf varchar(20)
declare @nome varchar(20)
declare @cond_Where varchar(200)
set @cond_Where = ''
set @idcliente = null -- 962751
set @cpf = null -- 962751
set @nome = 'JOSE'

set @sql = 'select * from cliente cli (nolock)
inner join
endereco_entrega_cliente ent (nolock)
on
cli.id_cliente = ent.id_cliente'

if @nome is not null
set @sql = @sql + ' where ent.strnome ='''+ @nome +''' OR cli.nome_razao_cliente = '''+ @nome +''''
else
set @sql = @sql + ' where cli.id_cliente = 962751'
exec (@sql)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.