转换PascalCase中的文本

Lor*_*nzo 7 sql-server pascalcasing sql-server-2005 sql-server-2008

是否可以使用正确的SQL代码将文本从SQL Server中的表列转换为PascalCase?

TABLE DEFINITION
----------------------
ID  int
CITTA   varchar(50)
PROV    varchar(50)
CAP varchar(50)
COD varchar(50)
Run Code Online (Sandbox Code Playgroud)

包含要转换的文本的字段是CITTA.它包含所有大写值,如"ABANO TERME","ROMA"等.这些单词由空格分隔.

编辑

我忘了提到一些单词中有一个重音字符'.这个字符可以在单词的末尾或中间找到.

编辑2:

结果中发现了一些怪癖:

  • 如果我有一个像"ISOLA BALBA"这样的名字,这个名字会被翻译成"IsolaBalba"(正确的情况但是错过了空间)
  • 如果我有一个像"ISOLA D'ASTI"这样的名字,就会转换为"IsolaD'asti"(错过的空间和之前的错误情况.在这种情况下,正确的结果是"Isola D'Asti"

你能否就这个小问题给我一些建议?

G M*_*ros 7

我鼓励您尝试我不久前在博客中发布的代码。我怀疑它能很好地满足您的要求,并且比许多其他方法表现得更好。

SQL Server 正确大小写函数

CREATE FUNCTION dbo.Proper(@DATA VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
  DECLARE @Position INT

  SELECT @DATA = STUFF(LOWER(@DATA), 1, 1, UPPER(LEFT(@DATA, 1))),
         @Position = PATINDEX('%[^a-zA-Z][a-z]%', @DATA COLLATE Latin1_General_Bin)

  WHILE @Position > 0
    SELECT @DATA = STUFF(@DATA, @Position, 2, UPPER(SUBSTRING(@DATA, @Position, 2))),
           @Position = PATINDEX('%[^a-zA-Z][a-z]%', @DATA COLLATE Latin1_General_Bin)

  RETURN @DATA
END
Run Code Online (Sandbox Code Playgroud)

这个函数比大多数函数要快一些,因为它只为每个需要大写字母的单词循环一次。


Mar*_*ith 5

DECLARE @T TABLE
(
ID  INT PRIMARY KEY,
CITTA   VARCHAR(50)
)
INSERT INTO @T
SELECT 1, 'ABANO TERME' UNION ALL SELECT 2, 'ROMA' UNION ALL SELECT 3, 'ISOLA D''ASTI';

IF OBJECT_ID('tempdb..#HolderTable') IS NOT NULL
    DROP TABLE #HolderTable

CREATE TABLE #HolderTable
(
Idx INT IDENTITY(1,1) PRIMARY KEY,
ID INT,
Word  VARCHAR(50)
)

CREATE NONCLUSTERED INDEX ix ON #HolderTable(ID)
;

WITH T1 AS
(
SELECT ID, CAST(N'<root><r>' + REPLACE(REPLACE(CITTA, '''', '''</r><r>'), ' ', ' </r><r>') + '</r></root>' AS XML) AS xl
FROM @T
)
INSERT INTO #HolderTable
SELECT ID, 
       r.value('.','NVARCHAR(MAX)') AS Item
 FROM T1
 CROSS APPLY
xl.nodes('//root/r') AS RECORDS(r)

SELECT 
      ID, 
      (SELECT STUFF(LOWER(Word),1,1,UPPER(LEFT(Word,1))) FROM #HolderTable WHERE [@T].ID =  #HolderTable.ID ORDER BY Idx FOR XML PATH('') )
FROM @T [@T]
Run Code Online (Sandbox Code Playgroud)