Firebird: Gostaria que essa função, na clausula where, o l.destino recebesse a variavel @destino, porém preciso concatenar ela a uma string.

30/06/2023

0

SQL

CREATE FUNCTION [dbo].[MinhaFuncao](@destino VARCHAR(max))
RETURNS TABLE
AS
RETURN (
SELECT *
FROM OpenQuery(TOTALIP,
'SELECT
c.nome AS NOME,
CASE
WHEN u.nome IS NULL THEN ''''
ELSE u.nome
END AS OPERADOR,
l.data AS DATA,
CASE
WHEN l.status = ''ANSWERED'' THEN ''ATENDIDA''
WHEN l.status = ''NO ANSWER'' THEN ''NÃO ATENDIDA''
WHEN l.status = ''FAILED'' THEN ''FALHA''
ELSE l.status
END AS STATUS,
CASE
WHEN LENGTH(l.destino) = 12 AND LEFT(l.destino, 1) = ''0'' THEN LTRIM(l.destino, ''0'')
-- WHEN LENGTH(l.destino) = 9 THEN CONCAT(''11'', l.destino)
ELSE l.destino
END AS DESTINO,
CURRENT_DATE AS DISCAGEM
FROM
public.ligacoes_ativo l
INNER JOIN public.campanhas c ON l.id_campanha = c.id
LEFT JOIN public.usuarios u ON l.ramal = u.ramal
WHERE
l.data >= CURRENT_DATE
AND l.destino = ||'@destino'|| '));
GO
Gustavo

Gustavo

Responder

Posts

03/07/2023

Arthur Heinrich

O SQL Server é meio chatinho com relação a isso.

A solução é criar uma variável e concatenar o texto na variável.

declare @SQL = varchar(max)
set @SQL = 'select ... where l.destino '''+@destino+''''

Depois você faz: SELECT * FROM OpenQuery(TOTALIP,@SQL)

Ignorando inicialmente o fato de alguém poder tentar um SQL Injection, veja que, como a variável @destino é do tipo varchar, seu conteúdo precisaria aparecer na query entre aspas.
Para inserir a aspas dentro do texto, que é delimitado por aspas, deve-se colocar duas aspas consecutivas.

Para não cair no SQL Injection, você pode utilizar BIND VARIABLES, ou concatenar com o replace(@destino,'''',''''''), substituindo aspas simples por duas aspas simples.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar