una primera pasar palabra minusculas mayusculas mayuscula longitud letra initcap hasta extraer diferenciar caracteres caracter cadena cada sql sql-server string

primera - sql pasar a mayuscula



¿Cuál es la mejor manera de poner en mayúscula la primera letra de cada palabra en una cadena en SQL Server? (8)

¿Cuál es la mejor manera de poner en mayúscula la primera letra de cada palabra en una cadena en SQL Server.


Aquí está el código de una línea más simple.

select LEFT(column, 1)+ lower(RIGHT(column, len(column)-1) ) from [tablename]


Como una función de valor de tabla:

CREATE FUNCTION dbo.InitCap(@v AS VARCHAR(MAX)) RETURNS TABLE AS RETURN WITH a AS ( SELECT ( SELECT UPPER(LEFT(value, 1)) + LOWER(SUBSTRING(value, 2, LEN(value))) AS ''data()'' FROM string_split(@v, '' '') FOR XML PATH (''''), TYPE) ret) SELECT CAST(a.ret AS varchar(MAX)) ret from a GO

Tenga en cuenta que string_split requiere COMPATIBILITY_LEVEL 130.


Deberías probar esto en su lugar

Select INITCAP(column_name) from table_name;

Esto capitalizará la primera letra de las entradas de atributos mencionados.


Desde http://www.sql-server-helper.com/functions/initcap.aspx

CREATE FUNCTION [dbo].[InitCap] ( @InputString varchar(4000) ) RETURNS VARCHAR(4000) AS BEGIN DECLARE @Index INT DECLARE @Char CHAR(1) DECLARE @PrevChar CHAR(1) DECLARE @OutputString VARCHAR(255) SET @OutputString = LOWER(@InputString) SET @Index = 1 WHILE @Index <= LEN(@InputString) BEGIN SET @Char = SUBSTRING(@InputString, @Index, 1) SET @PrevChar = CASE WHEN @Index = 1 THEN '' '' ELSE SUBSTRING(@InputString, @Index - 1, 1) END IF @PrevChar IN ('' '', '';'', '':'', ''!'', ''?'', '','', ''.'', ''_'', ''-'', ''/'', ''&'', '''''''', ''('') BEGIN IF @PrevChar != '''''''' OR UPPER(@Char) != ''S'' SET @OutputString = STUFF(@OutputString, @Index, 1, UPPER(@Char)) END SET @Index = @Index + 1 END RETURN @OutputString END GO

Aquí hay uno más simple / más pequeño (pero no funciona si una fila no tiene espacios, "Parámetro de longitud inválido pasado a la función DERECHA"):

http://www.devx.com/tips/Tip/17608


Otra solución sin utilizar el bucle: enfoque basado en conjuntos puros con CTE recursivo

create function [dbo].InitCap (@value varchar(max)) returns varchar(max) as begin declare @separator char(1) = '' '', @result varchar(max) = ''''; with r as ( select value, cast(null as varchar(max)) [x], cast('''' as varchar(max)) [char], 0 [no] from (select rtrim(cast(@value as varchar(max))) [value]) as j union all select right(value, len(value)-case charindex(@separator, value) when 0 then len(value) else charindex(@separator, value) end) [value] , left(r.[value], case charindex(@separator, r.value) when 0 then len(r.value) else abs(charindex(@separator, r.[value])-1) end ) [x] , left(r.[value], 1) , [no] + 1 [no] from r where value > '''') select @result = @result + case when ascii([char]) between 97 and 122 then stuff(x, 1, 1, char(ascii([char])-32)) else x end + @separator from r where x is not null; set @result = rtrim(@result); return @result; end


Para datos solo en inglés.

Súper no eficiente desde el punto de vista del rendimiento pero eficiente desde la vista de la productividad. Úselo como convertidor de una sola vez:

SELECT REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( REPLACE( UPPER(LEFT(City,1))+LOWER(SUBSTRING(City,2,LEN(City))) ,'' a'', '' A'') ,'' b'', '' B'') ,'' c'', '' C'') ,'' d'', '' D'') ,'' e'', '' E'') ,'' f'', '' F'') ,'' g'', '' G'') ,'' h'', '' H'') ,'' i'', '' I'') ,'' j'', '' J'') ,'' k'', '' K'') ,'' l'', '' L'') ,'' m'', '' M'') ,'' n'', '' N'') ,'' o'', '' O'') ,'' p'', '' P'') ,'' q'', '' Q'') ,'' r'', '' R'') ,'' s'', '' S'') ,'' t'', '' T'') ,'' u'', '' U'') ,'' v'', '' V'') ,'' w'', '' W'') ,'' x'', '' X'') ,'' y'', '' Y'') ,'' z'', '' Z'') FROM [Dictionaries].[dbo].[Cities] WHERE Country = ''US'' AND City like ''% %'' ORDER BY City


Una variación de la que he estado usando durante bastante tiempo es:

CREATE FUNCTION [widget].[properCase](@string varchar(8000)) RETURNS varchar(8000) AS BEGIN SET @string = LOWER(@string) DECLARE @i INT SET @i = ASCII(''a'') WHILE @i <= ASCII(''z'') BEGIN SET @string = REPLACE( @string, '' '' + CHAR(@i), '' '' + CHAR(@i-32)) SET @i = @i + 1 END SET @string = CHAR(ASCII(LEFT(@string, 1))-32) + RIGHT(@string, LEN(@string)-1) RETURN @string END

Puede modificar fácilmente para manejar caracteres después de elementos que no sean espacios si lo desea.


BEGIN DECLARE @string varchar(100) = ''asdsadsd asdad asd'' DECLARE @ResultString varchar(200) = '''' DECLARE @index int = 1 DECLARE @flag bit = 0 DECLARE @temp varchar(2) = '''' WHILE (@Index <LEN(@string)+1) BEGIN SET @temp = SUBSTRING(@string, @Index-1, 1) --select @temp IF @temp = '' '' OR @index = 1 BEGIN SET @ResultString = @ResultString + UPPER(SUBSTRING(@string, @Index, 1)) END ELSE BEGIN SET @ResultString = @ResultString + LOWER(SUBSTRING(@string, @Index, 1)) END SET @Index = @Index+ 1--increase the index END SELECT @ResultString

FIN