mi estrategia
- Si el nombre ya está en mayúsculas y minúsculas, la confianza de que es lo correcto.
- Si el nombre no está en mayúsculas y minúsculas, a continuación, hacer lo siguiente:
- Recorte el nombre de eliminar el espacio en blanco
- cuenta de los nombres que comienzan con “Mc” como “McDavid”
- cuenta para nombres con apóstrofes como O'Reilly
- cuenta de los nombres con guión (nombres de casada) “Anderson-Johnson”
- cuenta para múltiples nombres de palabras como “la Russa”
- Asegúrese de que los sufijos incluidas en el campo de nombres se capitalizan adecuadamente
El Código
Aquí está mi post original en esto: Converting String to Camel Case in SQL Server
CREATE FUNCTION [dbo].[GetCamelCaseName]
(
@Name varchar(50)
)
RETURNS VARCHAR(50) WITH SCHEMABINDING
AS
BEGIN
-- Declare the return variable here
DECLARE @NameCamelCase VARCHAR(50)
-- This is determining whether or not the name is in camel case already (if the 1st character is uppercase
-- and the third is lower (because the 2nd could be an apostrophe). To do this, you have to cast the
-- character as varbinary and compare it with the upper case of the character cast as varbinary.
IF (CAST(SUBSTRING(@Name, 1,1) as varbinary) = CAST(SUBSTRING(UPPER(@Name), 1, 1) as varbinary)
AND ((CAST(SUBSTRING(@Name, 2,1) as varbinary) = CAST(SUBSTRING(LOWER(@Name), 2, 1) as varbinary)
AND SUBSTRING(@Name, 2,1) != '''')
or
(CAST(SUBSTRING(@Name, 4,1) as varbinary) = CAST(SUBSTRING(LOWER(@Name), 4, 1) as varbinary)
AND SUBSTRING(@Name, 2,1) = '''')))
BEGIN
SELECT @NameCamelCase = RTRIM(LTRIM(@Name))
SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' sr', ' Sr')
SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' jr', ' Jr')
SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' ii', ' II')
SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' iii', ' III')
SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' DE ', ' de ')
SELECT @NameCamelCase = REPLACE(@NameCamelCase, 'macdonald', 'MacDonald')
if (@NameCamelCase LIKE '% iv') -- avoid changing "Ivan" to "IVan"
SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' iv', ' IV')
if ((@NameCamelCase = 'i') or (@NameCamelCase = 'ii') or (@NameCamelCase = 'iii') or (@NameCamelCase = 'iv'))
SELECT @NameCamelCase = UPPER(@NameCamelCase)
RETURN @NameCamelCase
END
ELSE
BEGIN
SELECT @NameCamelCase = RTRIM(LTRIM(@Name))
-- "Mc-"
SELECT @NameCamelCase =
CASE
WHEN @Name LIKE 'mc%'
THEN UPPER(SUBSTRING(@Name, 1, 1)) + LOWER(SUBSTRING(@Name, 2, 1)) + UPPER(SUBSTRING(@Name, 3, 1)) + LOWER(SUBSTRING(@Name, 4, 47))
ELSE
UPPER(SUBSTRING(@Name, 1, 1)) + LOWER(SUBSTRING(@Name, 2, 49))
END
-- Apostrophes
SELECT @NameCamelCase =
CASE
WHEN @NameCamelCase LIKE '%''%'
THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX('''', @NameCamelCase) - 1) + '''' + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX('''', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX('''', @NameCamelCase) + 2, 50)
ELSE
@NameCamelCase
END
-- Hyphenated names (do it twice to account for double hyphens)
SELECT @NameCamelCase =
CASE
WHEN @NameCamelCase LIKE '%-%'
THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX('-', @NameCamelCase) - 1) + '^' + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX('-', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX('-', @NameCamelCase) + 2, 50)
ELSE
@NameCamelCase
END
SELECT @NameCamelCase =
CASE
WHEN @NameCamelCase LIKE '%-%'
THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX('-', @NameCamelCase) - 1) + '^' + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX('-', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX('-', @NameCamelCase) + 2, 50)
ELSE
@NameCamelCase
END
SELECT @NameCamelCase = REPLACE(@NameCamelCase, '^', '-')
-- Multiple word names (do it twice to account for three word names)
SELECT @NameCamelCase =
CASE
WHEN @NameCamelCase LIKE '% %'
THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX(' ', @NameCamelCase) - 1) + '?' + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX(' ', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX(' ', @NameCamelCase) + 2, 50)
ELSE
@NameCamelCase
END
SELECT @NameCamelCase =
CASE
WHEN @NameCamelCase LIKE '% %'
THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX(' ', @NameCamelCase) - 1) + '?' + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX(' ', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX(' ', @NameCamelCase) + 2, 50)
ELSE
@NameCamelCase
END
SELECT @NameCamelCase = REPLACE(@NameCamelCase, '?', ' ')
-- Names in Parentheses
SELECT @NameCamelCase =
CASE
WHEN @NameCamelCase LIKE '%(%'
THEN SUBSTRING(@NameCamelCase, 1, CHARINDEX('(', @NameCamelCase) - 1) + '(' + UPPER(SUBSTRING(@NameCamelCase, CHARINDEX('(', @NameCamelCase) + 1, 1)) + SUBSTRING(@NameCamelCase, CHARINDEX('(', @NameCamelCase) + 2, 50)
ELSE
@NameCamelCase
END
SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' sr', ' Sr')
SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' jr', ' Jr')
SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' ii', ' II')
SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' iii', ' III')
SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' DE ', ' de ')
SELECT @NameCamelCase = REPLACE(@NameCamelCase, 'macdonald', 'MacDonald')
if (@NameCamelCase LIKE '% iv')
SELECT @NameCamelCase = REPLACE(@NameCamelCase, ' iv', ' IV')
if ((@NameCamelCase = 'i') or (@NameCamelCase = 'ii') or (@NameCamelCase = 'iii') or (@NameCamelCase = 'iv'))
SELECT @NameCamelCase = UPPER(@NameCamelCase)
-- Return the result of the function
RETURN ISNULL(@NameCamelCase, '')
END
RETURN ISNULL(@NameCamelCase, '')
END
Técnicamente, eso sería PascalCase. – Thomas
@thomas, técnicamente no es ninguna de las dos cosas, es solo una cadena de palabras en mayúscula –
@nathan gonzalez - Estoy corregido. – Thomas