Tenho uma tabela que foi importada como toda em MAIÚSCULAS e gostaria de transformá-la em Caixa Própria. Que script algum de vocês usou para completar isso?
sql
sql-server
uppercase
title-case
RyanKeeter
fonte
fonte
Respostas:
Aqui está uma UDF que fará o truque ...
Você ainda terá que usá-lo para atualizar seus dados.
fonte
Esta função:
Resultado:
fonte
O'DONNELL
não seja alterado paraO'donnell
.SET @o = @o + @c
paraSET @o = @o + UPPER(@c)
. =)http://sqlmag.com/t-sql/how-title-case-column-value
fonte
title
estiver vazio.WHERE title IS NOT NULL
ao final para resolver o problema de @Serg.SUBSTRING
vez deRIGHT
Se você pode habilitar o CLR no SQL Server (requer 2005 ou posterior), então você pode criar uma função CLR que usa a função interna TextInfo.ToTitleCase que permitiria a você criar uma maneira cultural de fazer isso em apenas alguns linhas de código.
fonte
Eu sei que esta é uma postagem tardia neste tópico, mas vale a pena olhar. Esta função funciona para mim sempre. Então pensei em compartilhá-lo.
Chamadas de teste:
Resultados:
fonte
Estou um pouco atrasado no jogo, mas acredito que seja mais funcional e funcione com qualquer idioma, incluindo russo, alemão, tailandês, vietnamita, etc. Isso tornará qualquer coisa maiúscula depois de 'ou - ou. ou (ou) ou espaço (obviamente :).
fonte
Se você estiver no SSIS importando dados que possuem maiúsculas e minúsculas e precisa fazer uma pesquisa em uma coluna com letras maiúsculas e minúsculas, você notará que a pesquisa falha onde a fonte é misturada e a fonte de pesquisa é adequada. Você também notará que não pode usar as funções direita e esquerda no SSIS para SQL Server 2008r2 para colunas derivadas. Aqui está uma solução que funciona para mim:
fonte
Aqui está uma versão que usa uma sequência ou tabela de números em vez de um loop. Você pode modificar a cláusula WHERE para se adequar às suas regras pessoais para quando converter um caractere para maiúsculas. Acabei de incluir um conjunto simples que colocará em maiúsculas qualquer letra que seja precedida por uma não-letra, com exceção dos apóstrofos. Isso significa, entretanto, que 123apple teria uma correspondência no "a" porque "3" não é uma letra. Se você deseja apenas espaço em branco (espaço, tabulação, retorno de carro, avanço de linha), pode substituir o padrão
'[^a-z]'
por'[' + Char(32) + Char(9) + Char(13) + Char(10) + ']'
.fonte
O link que postei acima é uma ótima opção que aborda a questão principal: que nunca podemos contabilizar programaticamente todos os casos (Smith-Jones, von Haussen, John Smith MD), pelo menos não de uma maneira elegante. Tony apresenta o conceito de um caractere de exceção / quebra para lidar com esses casos. De qualquer forma, com base na ideia de Cervo (superior todos os caracteres inferiores precedidos por espaço), as instruções de substituição poderiam ser agrupadas em uma única tabela com base em substituição. Na verdade, qualquer combinação de caracteres inferior / superior poderia ser inserida em @alpha e a instrução não mudaria:
fonte
Faria sentido manter uma pesquisa de exceções para cuidar do The von Neumann's, McCain's, DeGuzman's e Johnson-Smith's.
fonte
Emprestado e aprimorado na resposta de @Richard Sayakanit. Isso lida com várias palavras. Como sua resposta, isso não usa UDFs, apenas funções integradas (
STRING_SPLIT
eSTRING_AGG
) e é muito rápido.STRING_AGG
requer SQL Server 2017, mas você sempre pode usar oSTUFF/XML
truque. Não lida com todas as exceções, mas pode funcionar muito bem para muitos requisitos.fonte
Uma ligeira modificação na resposta de @Galwegian - que se transforma, por exemplo,
St Elizabeth's
emSt Elizabeth'S
.Essa modificação mantém o apóstrofo-s em minúsculas, onde o s vem no final da string fornecida ou o s é seguido por um espaço (e apenas nessas circunstâncias).
Acontece:
st elizabeth's
para dentroSt Elizabeth's
o'keefe
para dentroO'Keefe
o'sullivan
para dentroO'Sullivan
Os comentários de outros de que soluções diferentes são preferíveis para entradas que não sejam em inglês permanecem o caso.
fonte
Acho que você vai descobrir que o seguinte é mais eficiente:
A instrução replace pode ser recortada e colada diretamente em uma consulta SQL. É muito feio, no entanto, ao substituir @str pela coluna na qual você está interessado, você não pagará um preço por um cursor implícito como faria com os udfs assim postados. Acho que mesmo usando meu UDF é muito mais eficiente.
Ah, e em vez de gerar a instrução de substituição manualmente, use isto:
De qualquer forma, depende do número de linhas. Gostaria que você pudesse fazer apenas s / \ b ([az]) / uc $ 1 /, mas tudo bem, trabalhamos com as ferramentas que temos.
NOTA você teria que usar isto da mesma forma que teria que usar como .... SELECT dbo.ProperCase (LOWER (coluna)) pois a coluna está em maiúsculas. Na verdade, funciona muito rápido na minha mesa de 5.000 entradas (nem mesmo um segundo), mesmo com o mais baixo.
Em resposta à enxurrada de comentários sobre internacionalização, apresento a seguinte implementação que lida com cada caractere ASCII contando apenas com a implementação de superior e inferior do SQL Server. Lembre-se de que as variáveis que estamos usando aqui são VARCHAR, o que significa que elas podem conter apenas valores ASCII. Para usar outros alfabetos internacionais, você deve usar o NVARCHAR. A lógica seria semelhante, mas você precisaria usar UNICODE e NCHAR no lugar de ASCII E CHAR e a instrução de substituição seria muito mais ampla ....
Basicamente, a premissa do meu método é trocar pré-computação por eficiência. A implementação ASCII completa é a seguinte:
fonte
É tarde demais para voltar e obter os dados não maiúsculos?
Os von Neumann's, McCain's, DeGuzman's e Johnson-Smith's de sua base de clientes podem não gostar do resultado do seu processamento ...
Além disso, estou supondo que se trata de uma atualização única dos dados. Pode ser mais fácil exportar, filtrar / modificar e reimportar os nomes corrigidos para o banco de dados, e então você pode usar abordagens não SQL para corrigir nomes ...
fonte
Aqui está outra variação que encontrei nos Fóruns SQLTeam.com @ http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=47718
fonte
Eu sei que o diabo está nos detalhes (especialmente no que diz respeito aos dados pessoais das pessoas), e que seria muito bom ter nomes devidamente capitalizados, mas o tipo de aborrecimento acima é o motivo pelo qual os pragmáticos e conscientes do tempo entre nós usam o seguinte :
SELECT UPPER('Put YoUR O'So oddLy casED McWeird-nAme von rightHERE here')
Na minha experiência, as pessoas ficam bem em ver SEU NOME ... mesmo quando está no meio de uma frase.
Consulte: os russos usaram um lápis!
fonte
Acabei de aprender
InitCap()
.Aqui está um exemplo de código:
fonte
Isso funcionou no SSMS:
fonte
Se você sabe que todos os dados são apenas uma palavra, aqui está uma solução. Primeiro atualize a coluna para todas inferiores e, em seguida, execute o seguinte
fonte
Recentemente tive que lidar com isso e veio com o seguinte depois que nada atingiu tudo o que eu queria. Isso fará uma frase inteira, casos para tratamento de palavras especiais. Também tivemos problemas com 'palavras' de um único caractere que muitos métodos mais simples tratam, mas não os métodos mais complicados. Variável de retorno único, sem loops ou cursores.
fonte
Copie e cole seus dados no MS Word e use a conversão de texto embutida para "Capitalize Cada Palavra". Compare com seus dados originais para abordar as exceções. Não consigo ver nenhuma maneira de contornar manualmente as exceções do tipo "MacDonald" e "IBM", mas foi assim que eu fiz FWIW.
fonte