Question

Est-il possible de convertir le texte à partir d'une colonne de table dans SQL Server à l'aide d'un PascalCase uniquement code SQL approprié?

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

Le champ qui contient du texte à convertir est CITTA. Il contient toutes les valeurs de majuscules comme « ABANO TERME », « ROMA », et ainsi de suite. Les mots sont délimités par un espace.

EDIT

J'ai oublié de mentionner que certains mots ont un caractère d'accent dans ce '. Ce caractère se trouve soit à la fin du mot ou au milieu.

EDIT 2:

Quelques bizarreries trouvées sur les résultats:

  • Si j'ai un nom comme « ISOLA Bâlba » ce nom se traduit à « IsolaBalba » (affaire correct, mais l'espace manqué)
  • Si j'ai un nom comme « ISOLA D'ASTI » ce sont convertis à « IsolaD'asti » (espace manqué comme avant et cas incorrect. Dans ce cas, le résultat correct est « Isola D'Asti »

pourrait vous s'il vous plaît me donner quelques conseils sur ce petit problème?

Était-ce utile?

La solution

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]

Autres conseils

Je vous encourage à essayer le code que j'ai posté dans un blog il y a un certain temps. Je soupçonne que ce sera répondre à vos besoins très bien, et aussi de meilleurs résultats que la plupart des autres méthodes.

SQL Server appropriée Fonction de cas

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

Cette fonction est un peu plus rapide que la plupart parce que les boucles qu'une seule fois pour chaque mot qui exige une lettre majuscule.

Essayez la fonction ci-dessous (ajuster le type de chaîne selon le cas). Il suffit de ne pas l'utiliser dans une clause WHERE - et prendre en compte les ramifications de performance ailleurs. Le 12345678 est juste un peu arbitrairement grande valeur que vous pouvez remplacer par quelque chose de plus approprié!

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top