Esta é uma consulta estática que mostra onde estou tentando obter
declare @Airbill VARCHAR(50) = '12345678912'
select stuff(stuff(@Airbill, 4, 0, '-'), 9, 0, '-')
Mas eu preciso torná-lo mais variável. Tenho a seguinte variável:
DECLARE @AirbillMask VARCHAR(50) = '999-9999-9999'
O que pode (e muda) mudar. É sempre '9's e '-'s. Mas a colocação deles muda.
- Se
@AirbillMask
é999-99-99-9999
meu resultado desejado seria123-45-67-8912
. - Se
@AirbillMask
é999-9999-9999
meu resultado desejado seria123-4567-8912
.
Estou executando dbo.FindPatternLocation(@AirbillMask, '-') que retorna uma tabela de locais de traço.
Eu estava planejando encontrar um caminho para STUFF
as partes dos @Airbill
locais correspondentes para produzir um campo calculado de FormattedAirbill
, mas fiquei preso tentando iterar nas STUFF
chamadas.
Existe uma maneira de ligar STUFF
dentro de outra STUFF
chamada, repetidamente, até que eu esteja sem filas?
Eu sinto que um CTE recursivo ou uma aplicação cruzada poderia fazer isso, mas não consigo entender isso.
NOTA: Eu preferiria fazer isso sem loop, se possível.
Seu exemplo é um número inteiro grande, então, supondo que isso seja típico, você pode usar
FORMAT
para issoDevoluções
Se não for possível alterar os formatos de máscara para usar
0
ou#
em vez disso9
, obviamente, pode ser feito facilmente em tempo de execução com um únicoREPLACE
caractere9
desejado.Consegui modificar esta resposta para chegar ao que estava procurando:
Ainda não testei o desempenho, mas obtenho os resultados corretos.