Frage

Ist es möglich, Text aus einer Tabellenspalte in SQL Server zu Pascal konvertiert nur einen richtigen SQL-Code verwenden?

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

Das Feld, das Text zu konvertieren enthält, ist CITTA. Es enthält alle Groß Werte wie „Abano Terme“, „ROMA“, und so weiter. Die Wörter werden durch ein Leerzeichen getrennt.

Bearbeiten

Ich habe vergessen zu erwähnen, dass einige Wörter einen Akzent Charakter haben darin '. Dieses Zeichen kann am Ende des Wortes oder in der Mitte gefunden entweder werden.

EDIT 2:

Einige auf Ergebnisse Macken:

  • Wenn ich einen Namen wie „ISOLA Bâlba“ diesem Namen „IsolaBalba“ übersetzt bekommen (richtige Fall aber verpasst Raum)
  • Wenn ich einen Namen wie „ISOLA D'ASTI“ diese get umgewandelt „IsolaD'asti“ (verpasste Raum nach wie vor und falsche Fall. In diesem Fall ist das richtige Ergebnis „Isola D'Asti“

könnten Sie bitte geben Sie mir einige Ratschläge zu diesem kleinen Problem?

War es hilfreich?

Lösung

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]

Andere Tipps

Ich möchte Sie ermutigen, den Code versuchen, ich in einem Blog vor einer Weile geschrieben. Ich vermute, dass es Ihre Anforderungen aufnehmen wird sehr gut, und auch eine bessere Leistung als viele der anderen Methoden.

SQL Server Proper Case Funktion

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

Diese Funktion ist ein bisschen schneller als die meisten, weil es Schleifen nur einmal für jedes Wort, das einen Großbuchstaben erfordert.

Versuchen Sie die folgende Funktion (String-Typen entsprechend anpassen). Genau dies tut nicht in einer WHERE-Klausel verwenden - und die Leistung Auswirkungen an anderer Stelle in Betracht ziehen. Die 12345678 ist nur einige willkürlich großen Wert, dass Sie mit etwas mehr angemessen ersetzen möchten!

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top