2010-12-08 26 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 

這個功能有點比大多數更快,因爲它僅需要一個大寫字母每個單詞循環一次。