我的策略
- 如果名称已经混合大小写,请相信它是正确的。
- 如果名称不是大小写混合,则执行以下操作:
- 修剪名称以消除空格
- 记下以“Mc”开头的名称,例如“McDavid”
- 考虑像 O'Reilly 这样带有撇号的名字
- “Anderson-Johnson”连字符名称(已婚名称)的帐户
- 考虑多个单词名称,例如“La Russa”
- 确保名称字段中包含的后缀正确大写
守则
这是我的原始帖子: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