webentwicklung-frage-antwort-db.com.de

SQL Server: Machen Sie alle Großbuchstaben in den richtigen Fall/Titel

Ich habe eine Tabelle, die wie alle UPPER CASE importiert wurde, und ich möchte sie in den richtigen Fall umwandeln. Welches Skript haben einige von Ihnen verwendet, um das abzuschließen?

74
RyanKeeter

Hier ist eine UDF, die den Trick tun wird ...

create function ProperCase(@Text as varchar(8000))
returns varchar(8000)
as
begin
  declare @Reset bit;
  declare @Ret varchar(8000);
  declare @i int;
  declare @c char(1);

  if @Text is null
    return null;

  select @Reset = 1, @i = 1, @Ret = '';

  while (@i <= len(@Text))
    select @c = substring(@Text, @i, 1),
      @Ret = @Ret + case when @Reset = 1 then UPPER(@c) else LOWER(@c) end,
      @Reset = case when @c like '[a-zA-Z]' then 0 else 1 end,
      @i = @i + 1
  return @Ret
end

Sie müssen es dennoch verwenden, um Ihre Daten zu aktualisieren.

63
Galwegian

Diese Funktion:

  • "Richtige Fälle" alle "UPPER CASE" Wörter, die durch Leerzeichen begrenzt sind
  • lässt "Kleinbuchstaben" allein
  • funktioniert auch für nicht englische Alphabete einwandfrei
  • ist portabel, da es keine ausgefallenen Funktionen der letzten SQL Server-Versionen verwendet
  • kann leicht geändert werden, um NCHAR und NVARCHAR für die Unicode-Unterstützung sowie jede Parameterlänge zu verwenden, die Sie für richtig halten
  • leerraumdefinition kann konfiguriert werden
CREATE FUNCTION ToProperCase(@string VARCHAR(255)) RETURNS VARCHAR(255)
AS
BEGIN
  DECLARE @i INT           -- index
  DECLARE @l INT           -- input length
  DECLARE @c NCHAR(1)      -- current char
  DECLARE @f INT           -- first letter flag (1/0)
  DECLARE @o VARCHAR(255)  -- output string
  DECLARE @w VARCHAR(10)   -- characters considered as white space

  SET @w = '[' + CHAR(13) + CHAR(10) + CHAR(9) + CHAR(160) + ' ' + ']'
  SET @i = 1
  SET @l = LEN(@string)
  SET @f = 1
  SET @o = ''

  WHILE @i <= @l
  BEGIN
    SET @c = SUBSTRING(@string, @i, 1)
    IF @f = 1 
    BEGIN
     SET @o = @o + @c
     SET @f = 0
    END
    ELSE
    BEGIN
     SET @o = @o + LOWER(@c)
    END

    IF @c LIKE @w SET @f = 1

    SET @i = @i + 1
  END

  RETURN @o
END

Ergebnis:

dbo.ToProperCase('ALL UPPER CASE and    SOME lower ÄÄ ÖÖ ÜÜ ÉÉ ØØ ĈĈ ÆÆ')
-----------------------------------------------------------------
All Upper Case and      Some lower Ää Öö Üü Éé Øø Cc Ææ
97
Tomalak
UPDATE titles
  SET title =
      UPPER(LEFT(title, 1)) +
        LOWER(RIGHT(title, LEN(title) - 1))

http://sqlmag.com/t-sql/how-title-case-column-value

33

Wenn Sie die CLR in SQL Server aktivieren können (erfordert 2005 oder höher), können Sie eine CLR-Funktion erstellen mit der eingebauten Funktion integrierte TextInfo.ToTitleCase-Funktion erstellen, um die Erstellung zu ermöglichen eine kulturbewusste Art und Weise, dies in nur wenigen Zeilen Code zu tun.

16
Greg Beech

Ich bin ein bisschen spät im Spiel, aber ich glaube, dass dies funktionaler ist und mit jeder Sprache funktioniert, einschließlich Russisch, Deutsch, Thailändisch, Vietnamesisch usw .. Es wird alles nach 'oder - oder Großbuchstaben machen. oder (oder) oder Leerzeichen (offensichtlich :).

CREATE FUNCTION [dbo].[fnToProperCase]( @name nvarchar(500) )
RETURNS nvarchar(500)
AS
BEGIN
declare @pos    int = 1
      , @pos2   int

if (@name <> '')--or @name = lower(@name) collate SQL_Latin1_General_CP1_CS_AS or @name = upper(@name) collate SQL_Latin1_General_CP1_CS_AS)
begin
    set @name = lower(rtrim(@name))
    while (1 = 1)
    begin
        set @name = stuff(@name, @pos, 1, upper(substring(@name, @pos, 1)))
        set @pos2 = patindex('%[- ''.)(]%', substring(@name, @pos, 500))
        set @pos += @pos2
        if (isnull(@pos2, 0) = 0 or @pos > len(@name))
            break
    end
end

return @name
END
GO
7
Alansoft

Ich weiß, dass es sich um einen späten Beitrag in diesem Thread handelt, aber sehenswert. Diese Funktion funktioniert immer für mich. Also dachte ich daran, es zu teilen.

CREATE FUNCTION [dbo].[fnConvert_TitleCase] (@InputString VARCHAR(4000) )
RETURNS VARCHAR(4000)
AS
BEGIN
DECLARE @Index INT
DECLARE @Char CHAR(1)
DECLARE @OutputString VARCHAR(255)

SET @OutputString = LOWER(@InputString)
SET @Index = 2
SET @OutputString = STUFF(@OutputString, 1, 1,UPPER(SUBSTRING(@InputString,1,1)))

WHILE @Index <= LEN(@InputString)
BEGIN
    SET @Char = SUBSTRING(@InputString, @Index, 1)
    IF @Char IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&','''','(')
    IF @Index + 1 <= LEN(@InputString)
BEGIN
    IF @Char != ''''
    OR
    UPPER(SUBSTRING(@InputString, @Index + 1, 1)) != 'S'
    SET @OutputString =
    STUFF(@OutputString, @Index + 1, 1,UPPER(SUBSTRING(@InputString, @Index + 1, 1)))
END
    SET @Index = @Index + 1
END

RETURN ISNULL(@OutputString,'')
END

Testanrufe:

select dbo.fnConvert_TitleCase(Upper('ÄÄ ÖÖ ÜÜ ÉÉ ØØ ĈĈ ÆÆ')) as test
select dbo.fnConvert_TitleCase(upper('Whatever the mind of man can conceive and believe, it can achieve. – Napoleon hill')) as test

Ergebnisse:

enter image description here

Wenn Sie in SSIS Daten importieren, bei denen gemischte Fälle vorliegen, und eine Spalte mit korrektem Fall durchsucht werden muss, werden Sie feststellen, dass die Suche fehlschlägt, wenn die Quelle gemischt wird und die Suchquelle richtig ist. Sie werden auch feststellen, dass Sie die rechte und linke Funktion nicht verwenden können, SSIS für SQL Server 2008r2 für abgeleitete Spalten. Hier ist eine Lösung, die für mich funktioniert: 

UPPER(substring(input_column_name,1,1)) + LOWER(substring(input_column_name, 2, len(input_column_name)-1))
2
Kenjamarticus

Der Link, den ich oben gepostet habe, ist eine großartige Option, die das Hauptproblem anspricht: Wir können niemals für alle Fälle (Smith-Jones, von Haussen, John Smith M. D.) programmatisch Rechenschaft ablegen, zumindest nicht auf elegante Weise. Tony führt das Konzept eines Ausnahme-/Unterbrechungszeichens ein, um mit diesen Fällen umzugehen. Auf jeden Fall, wenn man auf Cervos Idee (alle oberen Zeichen unter dem vorangestellten Leerzeichen) aufbaut, könnten die Ersetzungsanweisungen stattdessen in einer einzigen Tabelle zusammengefasst werden. Tatsächlich könnte jede Kombination aus Tief- und Hochzeichen in @alpha eingefügt werden, und die Anweisung würde sich nicht ändern: 

declare @str    nvarchar(8000)
declare @alpha  table (low nchar(1), up nchar(1))


set @str = 'ALL UPPER CASE and    SOME lower ÄÄ ÖÖ ÜÜ ÉÉ ØØ ĈĈ ÆÆ'

-- stage the alpha (needs number table)
insert into @alpha
    -- A-Z / a-z
    select      nchar(n+32),
                nchar(n)
    from        dbo.Number
    where       n between 65 and 90 or
                n between 192 and 223

-- append space at start of str
set @str = lower(' ' + @str)

-- upper all lower case chars preceded by space
select  @str = replace(@str, ' ' + low, ' ' + up) 
from    @Alpha

select @str
1
Nathan Skerl

Es wäre sinnvoll, Ausnahmen zu suchen, um sich um The von Neumann, McCain, DeGuzman und Johnson-Smith zu kümmern.

1
Lee

Hier ist eine Version, die eine Sequenz- oder Zahlentabelle anstelle einer Schleife verwendet. Sie können die WHERE-Klausel entsprechend Ihren persönlichen Regeln ändern, wann ein Zeichen in Großbuchstaben umgewandelt werden soll. Ich habe gerade ein einfaches Set eingefügt, das jeden Buchstaben, der mit Ausnahme von Apostrophen von einem Nichtbuchstaben ausgeführt wird, großschreibt. Dies bedeutet jedoch, dass 123Apple eine Übereinstimmung mit dem "a" haben würde, da "3" kein Buchstabe ist. Wenn Sie nur Leerzeichen (Leerzeichen, Tabulator, Wagenrücklauf, Zeilenvorschub) wünschen, können Sie das Muster '[^a-z]' durch '[' + Char(32) + Char(9) + Char(13) + Char(10) + ']' ersetzen.


CREATE FUNCTION String.InitCap( @string nvarchar(4000) ) RETURNS nvarchar(4000) AS
BEGIN

-- 1. Convert all letters to lower case
    DECLARE @InitCap nvarchar(4000); SET @InitCap = Lower(@string);

-- 2. Using a Sequence, replace the letters that should be upper case with their upper case version
    SELECT @InitCap = Stuff( @InitCap, n, 1, Upper( SubString( @InitCap, n, 1 ) ) )
    FROM (
        SELECT (1 + n1.n + n10.n + n100.n + n1000.n) AS n
        FROM       (SELECT 0 AS n UNION SELECT    1 UNION SELECT    2 UNION SELECT    3 UNION SELECT    4 UNION SELECT    5 UNION SELECT    6 UNION SELECT    7 UNION SELECT    8 UNION SELECT    9) AS    n1
        CROSS JOIN (SELECT 0 AS n UNION SELECT   10 UNION SELECT   20 UNION SELECT   30 UNION SELECT   40 UNION SELECT   50 UNION SELECT   60 UNION SELECT   70 UNION SELECT   80 UNION SELECT   90) AS   n10
        CROSS JOIN (SELECT 0 AS n UNION SELECT  100 UNION SELECT  200 UNION SELECT  300 UNION SELECT  400 UNION SELECT  500 UNION SELECT  600 UNION SELECT  700 UNION SELECT  800 UNION SELECT  900) AS  n100
        CROSS JOIN (SELECT 0 AS n UNION SELECT 1000 UNION SELECT 2000 UNION SELECT 3000)                                                                                                             AS n1000
        ) AS Sequence
    WHERE 
        n BETWEEN 1 AND Len( @InitCap )
    AND SubString( @InitCap, n, 1 ) LIKE '[a-z]'                 /* this character is a letter */
    AND (
        n = 1                                                    /* this character is the first `character` */
        OR SubString( @InitCap, n-1, 1 ) LIKE '[^a-z]'           /* the previous character is NOT a letter */
        )
    AND (
        n < 3                                                    /* only test the 3rd or greater characters for this exception */
        OR SubString( @InitCap, n-2, 3 ) NOT LIKE '[a-z]''[a-z]' /* exception: The pattern <letter>'<letter> should not capatolize the letter following the apostrophy */
        )

-- 3. Return the modified version of the input
    RETURN @InitCap

END
1
Dennis Allen

Ich weiß, dass der Teufel im Detail steckt (besonders wenn es um die persönlichen Daten von Menschen geht) und dass es sehr schön wäre, Namen mit Großbuchstaben zu haben, aber die oben genannten Probleme sind der Grund, warum die pragmatischen, zeitbewussten unter uns die folgenden verwenden :

SELECT UPPER('Put YoUR O'So oddLy casED McWeird-nAme von rightHERE here')

Meiner Erfahrung nach ist es gut, wenn Leute IHREN NAMEN sehen ... auch wenn der halbe Satz durch ist.

Siehe: Die Russen haben einen Bleistift benutzt!

0
Vorlic

Eine leichte Modifikation der Antwort von @ Galwegian - die sich z. St Elizabeth's in St Elizabeth'S.

Bei dieser Änderung werden Apostrophe als Kleinbuchstaben verwendet, wobei das s am Ende der angegebenen Zeichenfolge steht oder auf das s ein Leerzeichen folgt (und dies nur unter diesen Umständen).

create function properCase(@text as varchar(8000))
returns varchar(8000)
as
begin
    declare @reset int;
    declare @ret varchar(8000);
    declare @i int;
    declare @c char(1);
    declare @d char(1);

    if @text is null
    return null;

    select @reset = 1, @i = 1, @ret = '';

    while (@i <= len(@text))
    select
        @c = substring(@text, @i, 1),
        @d = substring(@text, @i+1, 1),
        @ret = @ret + case when @reset = 1 or (@reset=-1 and @c!='s') or (@reset=-1 and @c='s' and @d!=' ') then upper(@c) else lower(@c) end,
        @reset = case when @c like '[a-za-z]' then 0 when @c='''' then -1 else 1 end,
        @i = @i + 1
    return @ret
end

Es wendet sich:

  • st elizabeth's in St Elizabeth's
  • o'keefe in O'Keefe
  • o'sullivan in O'Sullivan

Die Kommentare anderer, dass andere Lösungen für nicht-englische Eingaben vorzuziehen sind, bleiben der Fall.

0
philipnye

Ist es zu spät, um die nicht überholten Daten abzurufen? 

Die von Neumann-, McCain-, DeGuzman- und Johnson-Smith-Kunden Ihres Kundenstamms mögen das Ergebnis Ihrer Verarbeitung möglicherweise nicht mögen ...

Ich vermute auch, dass dies eine einmalige Aktualisierung der Daten sein soll. Es ist möglicherweise einfacher, die korrigierten Namen in die Datenbank zu exportieren, zu filtern/zu modifizieren und erneut zu importieren. Anschließend können Sie Nicht-SQL-Ansätze verwenden, um Namen zu beheben.

0
Toybuilder

Wenn Sie wissen, dass alle Daten nur ein einziges Wort sind, finden Sie hier eine Lösung. Aktualisieren Sie zuerst die Spalte auf alle niedrigeren Werte und führen Sie dann Folgendes aus

    update tableName set columnName = 
    upper(SUBSTRING(columnName, 1, 1)) + substring(columnName, 2, len(columnName)) from tableName
0
reggaeguitar

Ausgeliehene und verbesserte Antwort auf @Richard Sayakanit. Dies behandelt mehrere Wörter. Wie seine Antwort verwendet dies keine UDFs, nur eingebaute Funktionen (STRING_SPLIT und STRING_AGG) und ist ziemlich schnell. STRING_AGG erfordert SQL Server 2017, Sie können jedoch den STUFF/XML-Trick verwenden. Behandelt nicht jede Ausnahme, kann aber für viele Anforderungen gut funktionieren. 

SELECT StateName = 'North Carolina' 
INTO #States
UNION ALL
SELECT 'Texas'


;WITH cteData AS 
(
    SELECT 
        UPPER(LEFT(value, 1)) +
            LOWER(RIGHT(value, LEN(value) - 1)) value, op.StateName
    FROM   #States op
    CROSS APPLY STRING_SPLIT(op.StateName, ' ') AS ss
)
SELECT 
    STRING_AGG(value, ' ')
FROM cteData c 
GROUP BY StateName
0
Gabe

Ich denke, Sie werden feststellen, dass das Folgende effizienter ist:

IF OBJECT_ID('dbo.ProperCase') IS NOT NULL
    DROP FUNCTION dbo.ProperCase
GO
CREATE FUNCTION dbo.PROPERCASE (
    @str VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
    SET @str = ' ' + @str
    SET @str = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( @str, ' a', ' A'), ' b', ' B'), ' c', ' C'), ' d', ' D'), ' e', ' E'), ' f', ' F'), ' g', ' G'), ' h', ' H'), ' i', ' I'), ' j', ' J'), ' k', ' K'), ' l', ' L'), ' m', ' M'), ' n', ' N'), ' o', ' O'), ' p', ' P'), ' q', ' Q'), ' r', ' R'), ' s', ' S'), ' t', ' T'), ' u', ' U'), ' v', ' V'), ' w', ' W'), ' x', ' X'), ' y', ' Y'), ' z', ' Z')
    RETURN RIGHT(@str, LEN(@str) - 1)
END
GO

Die Ersetzen-Anweisung könnte ausgeschnitten und direkt in eine SQL-Abfrage eingefügt werden. Es ist extrem hässlich. Durch das Ersetzen von @str durch die Spalte, an der Sie interessiert sind, zahlen Sie jedoch keinen Preis für einen impliziten Cursor, wie Sie es mit den so angegebenen udfs tun würden. Ich finde, dass es sogar mit meiner UDF viel effizienter ist.

Oh und anstatt die Ersetzen-Anweisung von Hand zu generieren, verwenden Sie Folgendes:

-- Code Generator for expression
DECLARE @x  INT,
    @c  CHAR(1),
    @sql    VARCHAR(8000)
SET @x = 0
SET @sql = '@str' -- actual variable/column you want to replace
WHILE @x < 26
BEGIN
    SET @c = CHAR(ASCII('a') + @x)
    SET @sql = 'REPLACE(' + @sql + ', '' ' + @c+  ''', '' ' + UPPER(@c) + ''')'
    SET @x = @x + 1
END
PRINT @sql

Es hängt jedenfalls von der Anzahl der Zeilen ab. Ich wünschte, du könntest einfach s/\ b ([a-z])/uc $ 1/machen, aber na ja, wir arbeiten mit den Tools, die wir haben.

HINWEIS: Sie müssten dies verwenden, da Sie es als .... SELECT dbo.ProperCase (LOWER (Spalte)) verwenden müssten, da die Spalte in Großbuchstaben geschrieben wird. Auf meinem Tisch mit 5.000 Einträgen (nicht einmal eine Sekunde) funktioniert es sogar recht schnell, selbst mit den niedrigeren.

Als Antwort auf die Flut von Kommentaren bezüglich der Internationalisierung stelle ich die folgende Implementierung vor, die jedes ASCII-Zeichen behandelt, das nur auf der SQL Server-Implementierung von Upper und Lower basiert. Denken Sie daran, dass die hier verwendeten Variablen VARCHAR sind. Dies bedeutet, dass sie nur ASCII -Werte enthalten können. Um weitere internationale Alphabete verwenden zu können, müssen Sie NVARCHAR verwenden. Die Logik wäre ähnlich, aber Sie müssten UNICODE und NCHAR anstelle von ASCII AND CHAR verwenden, und die Ersetzungsanweisung wäre viel größer.

-- Code Generator for expression
DECLARE @x  INT,
    @c  CHAR(1),
    @sql    VARCHAR(8000),
    @count  INT
SEt @x = 0
SET @count = 0
SET @sql = '@str' -- actual variable you want to replace
WHILE @x < 256
BEGIN
    SET @c = CHAR(@x)
    -- Only generate replacement expression for characters where upper and lowercase differ
    IF @x = ASCII(LOWER(@c)) AND @x != ASCII(UPPER(@c))
    BEGIN
        SET @sql = 'REPLACE(' + @sql + ', '' ' + @c+  ''', '' ' + UPPER(@c) + ''')'
        SET @count = @count + 1
    END
    SET @x = @x + 1
END
PRINT @sql
PRINT 'Total characters substituted: ' + CONVERT(VARCHAR(255), @count)

Grundsätzlich ist die Prämisse der my-Methode der Einsatz von Pre-Computing für Effizienz. Die vollständige Implementierung von ASCII lautet wie folgt:

IF OBJECT_ID('dbo.ProperCase') IS NOT NULL
    DROP FUNCTION dbo.ProperCase
GO
CREATE FUNCTION dbo.PROPERCASE (
    @str VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
    SET @str = ' ' + @str
SET @str =     REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@str, ' a', ' A'), ' b', ' B'), ' c', ' C'), ' d', ' D'), ' e', ' E'), ' f', ' F'), ' g', ' G'), ' h', ' H'), ' i', ' I'), ' j', ' J'), ' k', ' K'), ' l', ' L'), ' m', ' M'), ' n', ' N'), ' o', ' O'), ' p', ' P'), ' q', ' Q'), ' r', ' R'), ' s', ' S'), ' t', ' T'), ' u', ' U'), ' v', ' V'), ' w', ' W'), ' x', ' X'), ' y', ' Y'), ' z', ' Z'), ' š', ' Š'), ' œ', ' Œ'), ' ž', ' Ž'), ' à', ' À'), ' á', ' Á'), ' â', ' Â'), ' ã', ' Ã'), ' ä', ' Ä'), ' å', ' Å'), ' æ', ' Æ'), ' ç', ' Ç'), ' è', ' È'), ' é', ' É'), ' ê', ' Ê'), ' ë', ' Ë'), ' ì', ' Ì'), ' í', ' Í'), ' î', ' Î'), ' ï', ' Ï'), ' ð', ' Ð'), ' ñ', ' Ñ'), ' ò', ' Ò'), ' ó', ' Ó'), ' ô', ' Ô'), ' õ', ' Õ'), ' ö', ' Ö'), ' ø', ' Ø'), ' ù', ' Ù'), ' ú', ' Ú'), ' û', ' Û'), ' ü', ' Ü'), ' ý', ' Ý'), ' þ', ' Þ'), ' ÿ', ' Ÿ')
    RETURN RIGHT(@str, LEN(@str) - 1)
END
GO
0
Cervo

Dies funktionierte im SSMS:

Select Jobtitle,
concat(Upper(LEFT(jobtitle,1)), SUBSTRING(jobtitle,2,LEN(jobtitle))) as Propercase
From [HumanResources].[Employee]
0
Sathish Babu

Hier ist eine weitere Variante, die ich in den SQLTeam.com-Foren gefunden habe. @ http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=47718

create FUNCTION PROPERCASE
(
--The string to be converted to proper case
@input varchar(8000)
)
--This function returns the proper case string of varchar type
RETURNS varchar(8000)
AS
BEGIN
IF @input IS NULL
BEGIN
--Just return NULL if input string is NULL
RETURN NULL
END

--Character variable declarations
DECLARE @output varchar(8000)
--Integer variable declarations
DECLARE @ctr int, @len int, @found_at int
--Constant declarations
DECLARE @LOWER_CASE_a int, @LOWER_CASE_z int, @Delimiter char(3), @UPPER_CASE_A int, @UPPER_CASE_Z int

--Variable/Constant initializations
SET @ctr = 1
SET @len = LEN(@input)
SET @output = ''
SET @LOWER_CASE_a = 97
SET @LOWER_CASE_z = 122
SET @Delimiter = ' ,-'
SET @UPPER_CASE_A = 65
SET @UPPER_CASE_Z = 90

WHILE @ctr <= @len
BEGIN
--This loop will take care of reccuring white spaces
WHILE CHARINDEX(SUBSTRING(@input,@ctr,1), @Delimiter) > 0
BEGIN
SET @output = @output + SUBSTRING(@input,@ctr,1)
SET @ctr = @ctr + 1
END

IF ASCII(SUBSTRING(@input,@ctr,1)) BETWEEN @LOWER_CASE_a AND @LOWER_CASE_z
BEGIN
--Converting the first character to upper case
SET @output = @output + UPPER(SUBSTRING(@input,@ctr,1))
END
ELSE
BEGIN
SET @output = @output + SUBSTRING(@input,@ctr,1)
END

SET @ctr = @ctr + 1

WHILE CHARINDEX(SUBSTRING(@input,@ctr,1), @Delimiter) = 0 AND (@ctr <= @len)
BEGIN
IF ASCII(SUBSTRING(@input,@ctr,1)) BETWEEN @UPPER_CASE_A AND @UPPER_CASE_Z
BEGIN
SET @output = @output + LOWER(SUBSTRING(@input,@ctr,1))
END
ELSE
BEGIN
SET @output = @output + SUBSTRING(@input,@ctr,1)
END
SET @ctr = @ctr + 1
END

END
RETURN @output
END



GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
0
Merritt

Ich habe gerade etwas über InitCap() erfahren. 

Hier ist ein Beispielcode:

SELECT ID
      ,InitCap(LastName ||', '|| FirstName ||' '|| Nvl(MiddleName,'')) AS RecipientName
FROM SomeTable
0
EdD