1
resposta

Stored Procedure com in

Olá, bom dia!

Fiz a stored procedure abaixo, e funciou corretamente, pesquisando por apenas um CPF

CREATE PROCEDURE AtualizarIdade @CPF VARCHAR(10)
AS

BEGIN
UPDATE [TABELA DE CLIENTES] SET IDADE = DATEDIFF(YEAR, [DATA DE NASCIMENTO], GETDATE())
WHERE @CPF = CPF
END

EXEC AtualizarIdade @CPF =  '123123124'

Mas quando coloco o uso do in para pesquisar por mais de um CPF, ela não faz a pesquisa, como posso fazer a pesquisar mais de um CPF específicos?

ALTER PROCEDURE AtualizarIdade @CPF VARCHAR(10)
AS

BEGIN
UPDATE [TABELA DE CLIENTES] SET IDADE = DATEDIFF(YEAR, [DATA DE NASCIMENTO], GETDATE())
WHERE @CPF IN (CPF)
END

EXEC AtualizarIdade @CPF IN ( '123123124', '1471156710')

Ocorre o erro:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeAgradeço quem puder ajudar

1 resposta

Oi, Vander, tudo bem?

Desde já, peço desculpas pela demora em te responder.

Para buscar por mais CPFs, podemos passar todos eles como se fossem uma única e string e, durante o filtro com o WHERE, separar cada dado para efetuar a atualização.

Para uma melhor compreensão, observe o exemplo abaixo:

ALTER PROCEDURE AtualizarIdade @CPFLista VARCHAR(MAX)
AS
BEGIN
UPDATE [TABELA DE CLIENTES] SET IDADE = DATEDIFF(YEAR, [DATA DE NASCIMENTO], GETDATE())
WHERE CPF IN (SELECT value FROM STRING_SPLIT(@CPFLista, ','))
END

EXEC AtualizarIdade @CPFLista = '1471156710,19290992743'

Inicialmente, alteramos o parâmetro a ser recebido para @CPFLista, ele será um VARCHAR com o seu valor máximo. No WHERE, por outro lado, criamos um filtro que irá analisar se o campo CPF está contido na busca abaixo:

(SELECT value FROM STRING_SPLIT(@CPFLista, ','))

Por meio da função STRING_SPLIT, quebramos o valor armazenado na variável @CPFLista sempre que houver uma vírgula dentro da string. Isso fará com que todos os CPFs fiquem separados e sejam reconhecidos de forma independente.

Nesse sentido, ao executar a procedure AtualizarIdade, escrevemos @CPFLista = 'CPF1,CPF2,CPF3'. Os CPFs contidos nesta string serão armazenados e fragmentados durante o processamento da procedure, permitindo o UPDATE individual de cada registro.

Trazendo para o exemplo que você compartilhou, o comando ficaria assim:

EXEC AtualizarIdade @CPFLista = '1471156710,19290992743'

Como o "separador" da string é a vírgula, precisamos nos atentar com relação ao conteúdo escrito, removendo, por exemplo, espaços desnecessários (que podem afetar a busca).

Vander, espero ter ajudado com a explicação! Caso surjam outras dúvidas, conte comigo.

Um forte abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!