Estou desenvolvendo um procedimento armazenado do SQL Server 2016 e quero obter os últimos caracteres de uma varchar(38)
coluna.
Eu sei que sempre haverá pelo menos 18 caracteres e não sei o comprimento exato da coluna, porque é variável.
Acho que posso obter o comprimento da coluna e fazer uma subtração para usar SUBSTRING
, mas não posso fazer isso porque estou fazendo isso:
set @externalCodes = (
select Serial, AggregationLevel
from ExternalCode where ProductionOrderId = @productionOrderId
for json path
Estou gerando um JSON e não sei como pegar o comprimento de cada Serial
coluna dentro de um select.
Minha pergunta é: como posso obter uma substring de uma string sem os primeiros 18 caracteres sem saber seu comprimento?
Uma solução poderia ser:
SUBSTRING(Serial, 18, 38)
E sempre retorna a substring de 18 até o final da string, mesmo que a string não tenha um comprimento de 38.
Sua
SUBSTRING
solução parece boa o suficiente, não sei por que você precisaria pedir mais alguma coisa. Eu gostaria apenas de observar que se você quiser pular os primeiros 18 caracteres, então você deve especificar 19 como o segundo argumento paraSUBSTRING
, porque no SQL as posições dos caracteres em uma string começam em 1. Então isso faz todo o sentido e deve funcionar bem para voce:Se você especificar 18, estará pulando 17 caracteres.
A solução usando
RIGHT
eLEN
, sugerida por George.Palacios também funcionará, mas os resultados dessas duas soluções podem não ser os mesmos, dependendo deSerial
haver espaços à direita. A razão para a possível diferença é que aLEN
função ignora espaços à direita, enquantoRIGHT
não o faz, o que significa que para uma string com espaços à direita o resultado provavelmente não será o que você esperaria.Deixe-me demonstrar isso usando um exemplo simples com uma string mais curta. Suponha que o comprimento máximo seja 10, o número de caracteres a serem ignorados seja 4 e a string específica seja
'abcde '
. (As aspas aqui são apenas delimitadores de string, para que você possa ver os espaços à direita.) Se você fizer issovocê obterá
'e '
como resultado, porqueSUBSTRING
simplesmente começará a cortar a string no 5º caractere e incluirá todos os caracteres até o final da string.Em contraste, a opção
RIGHT
/LEN
vai render
' '
. ALEN
função ignorará os dois espaços à direita e retornará 5. Subtrair 4 de 5 resulta em 1, portantoRIGHT
, retornará apenas um caractere mais à direita da string, que é um espaço.Como eu disse, porém, se
Serial
nunca puder ter espaços à direita, qualquer uma das opções servirá. Para completar, deixe-me sugerir mais uma, que usa aSTUFF
função:A
STUFF
função permite excluir uma substring e/ou inserir outra em uma determinada string em uma determinada posição. Portanto, para pular 18 caracteres usando esta função, você especifica a posição inicial 1, 18 caracteres para excluir e uma string vazia (''
) para substituí-los. ComoSUBSTRING
, esta solução funcionará corretamente com espaços à direita, caso você precise levá-los em consideração.Eu usaria:
Isso obtém o comprimento do campo e subtrai 18 dele, deixando você com tudo após o 18º caractere.