Usando um String com varios valores para consulta

SQL

22/02/2023

Boa Tarde Pessoal,


Estou fazendo uma query onde no DECLARE preciso colocar varias informações na mesma string e quando for na consulta como faço para usar o Like se for este o comando correto para o tipo de consulta que estamos precisando realizar?


DECLARE @cCpoFilial VARCHAR(2)
DECLARE @cCpoPedido VARCHAR(6)
DECLARE @cCpoNFOrigem VARCHAR(50)
DECLARE @cCpoFornecedor VARCHAR(6)

SET @cCpoFilial =''''51''''
SET @cCpoPedido =''''978289''''
SET @cCpoFornecedor =''''000055''''
SET @cCpoNFOrigem =(''''000632880'''',''''000641250'''',''''000636869'''')

-- CABEÇALHO DO PEDIDO DE VENDAS
SELECT C5_NOTA,C5_CLIENTE,C5_LOJACLI,* FROM SC5010(NOLOCK)
WHERE D_E_L_E_T_=''''''''
AND C5_FILIAL=@cCpoFilial
AND C5_NUM=@cCpoPedido
AND C5_NOTA LIKE @cCpoNFOrigem

Observação: No campo nota da variavel preciso colocar Varias notas fiscais.
Wanderson Fernandes

Wanderson Fernandes

Curtidas 0

Respostas

Frank Hosaka

Frank Hosaka

22/02/2023

Eu não colocaria as notas no campo de busca.
Faria assim:
Select * from sc5010 where filial=@filial and pedido=@pedido;
Mas se você quer listar apenas os pedidos que foram faturados, aí sim o campo da nf é importante e mudaria a consulta assim:
Select * from sc5010 where filial=@filial and pedido=@pedido and notafiscal;
Ou seja, iria usar o campo notafiscal só para filtrar os pedidos que foram faturados (não importa quantas notas existem lá dentro, mas o pedido que não tiver nenhuma nota, não será selecionado).
GOSTEI 0
Claudio Andrade

Claudio Andrade

22/02/2023

Boa Tarde Pessoal,


Estou fazendo uma query onde no DECLARE preciso colocar varias informações na mesma string e quando for na consulta como faço para usar o Like se for este o comando correto para o tipo de consulta que estamos precisando realizar?


DECLARE @cCpoFilial VARCHAR(2)
DECLARE @cCpoPedido VARCHAR(6)
DECLARE @cCpoNFOrigem VARCHAR(50)
DECLARE @cCpoFornecedor VARCHAR(6)

SET @cCpoFilial =''''51''''
SET @cCpoPedido =''''978289''''
SET @cCpoFornecedor =''''000055''''
SET @cCpoNFOrigem =(''''000632880'''',''''000641250'''',''''000636869'''')

-- CABEÇALHO DO PEDIDO DE VENDAS
SELECT C5_NOTA,C5_CLIENTE,C5_LOJACLI,* FROM SC5010(NOLOCK)
WHERE D_E_L_E_T_=''''''''
AND C5_FILIAL=@cCpoFilial
AND C5_NUM=@cCpoPedido
AND C5_NOTA LIKE @cCpoNFOrigem



Observação: No campo nota da variavel preciso colocar Varias notas fiscais.


Altere o LIKE por IN
Talvez precise algum ajustes para atender seu uso *

DECLARE @cCpoFilial VARCHAR(2)
DECLARE @cCpoPedido VARCHAR(6)
DECLARE @cCpoNFOrigem VARCHAR(50)
DECLARE @cCpoFornecedor VARCHAR(6)

SET @cCpoFilial ='51'
SET @cCpoPedido ='978289'
SET @cCpoFornecedor ='000055'
SET @cCpoNFOrigem =('000632880','000641250','000636869')

-- CABEÇALHO DO PEDIDO DE VENDAS
SELECT C5_NOTA,C5_CLIENTE,C5_LOJACLI,* FROM SC5010(NOLOCK)
WHERE D_E_L_E_T_=''
AND C5_FILIAL=@cCpoFilial
AND C5_NUM=@cCpoPedido
AND C5_NOTA IN @cCpoNFOrigem
-- ou usar assim
AND C5_NOTA IN ('000632880','000641250','000636869')

GOSTEI 0
Arthur Heinrich

Arthur Heinrich

22/02/2023

A maioria dos bancos não trabalha com filtros dinâmicos, como esse.

Você pode montar a query dinamicamente, concatenando as partes como o exemplo do Claudio e, depois, executar a query dinamicamente, usando sp_executesql.

Também dá para fazer uma gambiarra, mas ela não serve para utilizar o índice. Então, não é uma boa ideia. Na realidade é uma péssima ideia, mas vale o exemplo para compartilhar conhecimento.
DECLARE @cCpoFilial VARCHAR(2)
DECLARE @cCpoPedido VARCHAR(6)
DECLARE @cCpoNFOrigem VARCHAR(50)
DECLARE @cCpoFornecedor VARCHAR(6)
 
SET @cCpoFilial ='51'
SET @cCpoPedido ='978289'
SET @cCpoFornecedor ='000055'
SET @cCpoNFOrigem ='000632880,000641250,000636869'
 
-- CABEÇALHO DO PEDIDO DE VENDAS
SELECT C5_NOTA,C5_CLIENTE,C5_LOJACLI,* FROM SC5010(NOLOCK)
WHERE D_E_L_E_T_=''
AND C5_FILIAL=@cCpoFilial
AND C5_NUM=@cCpoPedido
AND C5_NOTA IN @cCpoNFOrigem
-- ou usar assim
AND ','+@cCpoNFOrigem+',' like '%,'+C5_NOTA+',%'


No final será o mesmo que:

AND ',000632880,000641250,000636869,' like '%,000641250,%'
GOSTEI 0
POSTAR