2010-12-08 66 views
6

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

TABLE DEFINITION 
---------------------- 
ID int 
CITTA varchar(50) 
PROV varchar(50) 
CAP varchar(50) 
COD varchar(50) 

包含要转换文本的字段是CITTA。它包含“ABANO TERME”,“ROMA”等所有大写字母值。这些词由空格分隔。

编辑

我忘了提,有些词有它'的重音字符。这个字符可以在单词的最后或中间找到。

编辑2:

成果发现的一些怪癖:

  • 如果我有像 “ISOLA BALBA” 一个名称,这个名称会转换为 “IsolaBalba”(正确的情况下,但错过了空间)
  • 如果我有一个像“伊索拉达斯蒂”这个转换为:“IsolaD'asti”(未空间之前和不正确的情况下,一个名字。在这种情况下,正确的结果是“伊索拉达斯蒂”

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

+2

可能。不确定SQL是否是这样做的最佳环境,但如果您给出示例输入和输出,我就会走了!目前用空格分隔单词吗?即是否需要将`pascal case`转换为`PascalCase`? – 2010-12-08 00:17:21

+0

@Martin:谢谢你的快速回答。看看我的问题编辑请 – Lorenzo 2010-12-08 00:28:06

+0

@洛伦佐 - 做UDFs作为适当的SQL代码为您的目的? – 2010-12-08 00:29:56

回答

4
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] 
2

尝试下面的函数(根据需要调整字符串类型)。只是不要在WHERE子句中使用它 - 并考虑其他地方的性能影响。 12345678只是一些任意大的值,你可能想用更合适的东西代替!

CREATE FUNCTION dbo.ufn_PascalCase(@str AS VARCHAR(MAX)) RETURNS VARCHAR(MAX) 
BEGIN 
    SET @str = LOWER(@str) 

    DECLARE @result VARCHAR(MAX) = '' 

    DECLARE @spaceIndex INTEGER = CHARINDEX(' ', @str) 
    WHILE @spaceIndex > 0 
    BEGIN 
     SET @result += UPPER(SUBSTRING(@str, 1, 1)) + SUBSTRING(@str, 2, @spaceIndex - 2) 
     SET @str = SUBSTRING(@str, @spaceIndex + 1, 12345678) 
     SET @spaceIndex = CHARINDEX(' ', @str) 
    END 

    SET @result += UPPER(SUBSTRING(@str, 1, 1)) + SUBSTRING(@str, 2, 12345678) 

    RETURN @result 
END 
3

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

SQL Server Proper Case Function

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 

这个功能有点比大多数更快,因为它仅需要一个大写字母每个单词循环一次。