Estou tentando escrever uma frase que obtenha apenas as strings que estão logo antes de um determinado caractere. por exemplo:
DECLARE @TEST VARCHAR(MAX)
SET @TEST = 'CAMP1 = 4 AND CAMP2 = 5 OR CAMP3 = 7 AND CAMP4 = 9'
Estou tentando analisar a string @TEST
e obter apenas os campos um por um e verificar se esses campos (CAMP1, CAMP2, CAMP3, CAMP4) realmente existem.
Não sei se seria necessário loop para varrer a string e pegar as strings antes de '=' e depois dos operadores lógicos 'AND, OR'.
Qualquer ajuda pls?
Parece que você está aceitando uma cláusula de filtragem que será usada como parte de uma consulta ad hoc e deseja tentar verificar se a consulta não produzirá um erro de "coluna não encontrada". Isso é quase certamente algo que você realmente não quer fazer, então eu questionaria o design em geral ...
Esse tipo de análise de string não será muito eficiente ou bonito em TSQL, então provavelmente seria melhor feito em outra camada e, como sua lógica de negócios sem dúvida está juntando a string de qualquer maneira, seria melhor verificar quando isso acontece e descobrir qualquer erro no início do processo. Se a sua lógica de negócios não estiver criando a string (ou seja, você a está aceitando de um código de terceiros ou, pior ainda, de um usuário), você terá que lidar com muitas variações na string (tabulações em vez de espaços, sem espaços ao redor o "=", espaço em branco extra incluindo quebras de linha, nomes escapados com
[
]
ou"
"
, e assim por diante).Mas supondo que você não tenha escolha porque este é o design de outra pessoa e você não tem poder para alterá-lo, você pode tentar algo como (pseudo código aqui, não se sentindo preguiçoso o suficiente agora, escreva manipulação detalhada de string TSQL!):
@LeftToProcess
@LeftToProcess
(verifique comcharindex
), faça o seguinte:@ColumnName
@LeftToProcess
TRIM()
@ColumnName
AND
por `` em@ColumnName
OR
por `` in@ColumnName
(essas duas etapas eliminam o operador lógico, não que elas criem um conjunto massivo de suposições como "sempre haverá exatamente um caractere de espaço entreAND
/OR
e o nome, se a entrada vier de um usuário ou terceiro festa você terá que ser muito mais inteligente do que isso)sys.objects
join parasys.columns
que sua tabela ou exibição contenha uma coluna do nome agora em@ColumnName
@SomeNotFound
como 1WHILE
loop, conforme retiramos a parte da string que acabamos de verificar, quando voltamos ao passo 3, o próximo "=" será encontrado ou, se não houver mais, vamos para o passo 12)@SomeNotFound
ainda for 0 no final do loop, tudo mencionado existe no objeto de destinoApresso-me em deixar claro, caso meu tom acima não o faça, que desaconselho veementemente esse tipo de coisa - é difícil obter absolutamente correto para todas as entradas possíveis e o resultado será difícil de manter se precisar ser expandido para lidar com outros tipos de cláusula.
É improvável que haja uma maneira significativamente mais limpa ou fácil de fazer exatamente o que você está pedindo no TSQL, seu design geral precisa ser repensado para evitá-lo, eu sinto.