2012-07-27 10 views
17

Ich habe eine Tabelle in meiner Datenbank. Der Name meines Tisches ist "Firma". Ich möchte Daten "company_name" als Großbuchstabe ändern. Beispielsweise;Wie aktualisiere ich Daten als Großbuchstabe mit dem Befehl t-sql?

"ABC COMPANY"

"DEF Plasticity"

als

"Abc Company"

"Def Plasticity"

Ich weiß, dass ich "UPDATE" sollte Befehl. Aber wie? Danke für Ihre Hilfe!

(CONCAT funktioniert nicht)

+3

Was Sie beschreiben, heißt "Title Case" und wird hier diskutiert: http://stackoverflow.com/questions/9595356/proper-title-case-in-t-sql – Brian

Antwort

24

SQL Server nicht Initcap Funktion wie Oracle haben Sie.

Sie können UDF für Initcap erstellen.

CREATE FUNCTION [dbo].[InitCap] (@InputString varchar(4000)) 
RETURNS VARCHAR(4000) 
AS 
BEGIN 

DECLARE @Index   INT 
DECLARE @Char   CHAR(1) 
DECLARE @PrevChar  CHAR(1) 
DECLARE @OutputString VARCHAR(255) 

SET @OutputString = LOWER(@InputString) 
SET @Index = 1 

WHILE @Index <= LEN(@InputString) 
BEGIN 
    SET @Char  = SUBSTRING(@InputString, @Index, 1) 
    SET @PrevChar = CASE WHEN @Index = 1 THEN ' ' 
         ELSE SUBSTRING(@InputString, @Index - 1, 1) 
        END 

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

    SET @Index = @Index + 1 
END 

RETURN @OutputString 

END 
GO 

für UDF Überprüfung Arbeits

select [dbo].[InitCap] ('stackoverflow com'); 

Stackoverflow Com 

Sie Ihren Tisch wie diese

update table 
set column=[dbo].[InitCap](column); 
+0

Danke, es funktioniert erfolgreich. – cethint

+0

@cethint froh, Ihnen zu helfen! –

+3

Das ist großartig! Sparte mir viel Zeit! Vielen Dank! – Bondt

7
update YourTable 
set  company_name = upper(substring(company_name,1,1)) + 
      lower(substring(company_name, 2, len(company_name)-1)) 
where len(company_name) > 0 

Live example at SQL Fiddle.

+0

W on't, das nur das erste Großbuchstabe setzte.Die SO will den ersten Buchstaben jedes Wortkapitals, soweit ich das beurteilen kann –

+0

Der erste Fall des zweiten Wortes ist kleingeschrieben. Ich will alle Wörter machen, erste Fälle müssen in Großbuchstaben stehen. – cethint

+0

In diesem Fall, überprüfen Sie [Rhooligans Link] (http://classicasp.aspfaq.com/general/how-do-i-convert-a-name-to-proper-case.html) – Andomar

1

Mit einer wenig Hilfe einer Split-Funktion wie this one.

die Sie interessieren, ersetzen YourTable mit dem, was Ihr Tabellenname:

update T 
set Name = P.Name 
from YourTable as T 
    cross apply (select (select upper(left(X.s, 1))+lower(stuff(X.s, 1, 1, ''))+' ' 
         from dbo.split(' ', Name) as X 
         for xml path(''), type).value('.', 'varchar(50)') 
      ) as P(Name) 
+0

Aber das ist nur 2 Beispiele. Ich habe viele Daten auf dem Tisch. Ich kann nicht einzeln oder mechanisch wechseln. – cethint

+0

Ok, ich habe das Zeug entfernt, das gerade da war, um das testen zu können. –

+0

Sie müssen auch ''varchar (50)'' in den Datentyp ändern, den Ihre Name-Spalte hat. –

0

Mit Verschuldung der obigen Beitrag aktualisieren kann, nutzt diese Funktion, um den ersten Buchstaben jedes Wortes mit Ausnahme derjenigen, das sind weniger als eine bestimmte Zeichenlänge, die als Akronyme angenommen werden. Wenn das kein Problem ist, dann setzen Sie das zweite Argument auf 0.

CREATE function [dbo].[f_camel_exc_short_words] (@InputString varchar(4000),@AcronymMaxLen INT) 
RETURNS VARCHAR(4000) 
AS 
BEGIN 

DECLARE @Index   INT 
DECLARE @Char   CHAR(1) 
DECLARE @PrevChar  CHAR(1) 
DECLARE @Word   VARCHAR(255) 
DECLARE @WordChar  CHAR(1) 
DECLARE @OutputString VARCHAR(255) 
DECLARE @WordIndex  INT 

SET @Word = '' 
SET @OutputString = '' 
SET @Index = 1 

WHILE @Index <= LEN(@InputString)+1 
BEGIN 
    SET @Char  = SUBSTRING(@InputString, @Index, 1) 
    SET @PrevChar = CASE WHEN @Index = 1 THEN ' ' ELSE SUBSTRING(@InputString, @Index - 1, 1) END 

    --IF @Char IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(') 
    -- SET @OutputString = @OutputString + @Char 

    IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(','0','1','2','3','4','5','6','7','8','9') or @Index = LEN(@InputString)+1 
    BEGIN 
     SET @WordIndex = 1 
     IF LEN(@Word) > @AcronymMaxLen 
     BEGIN 
      WHILE @WordIndex <= LEN(@Word) 
      BEGIN 
       SET @WordChar = SUBSTRING(@Word,@WordIndex,1) 
       if @WordIndex = 1 begin 
        SET @Word = STUFF(@Word,@WordIndex,1,UPPER(@WordChar)) end 
       else begin 
        SET @Word = STUFF(@Word,@WordIndex,1,LOWER(@WordChar)) end 
       SET @WordIndex = @WordIndex + 1 
      END 
     END 
     ELSE BEGIN 
      SET @Word = UPPER(@Word) 
     END 
     set @OutputString = @OutputString + @Word 
     SET @Word = '' 
    END 
    SET @Word = @Word + @Char 
    SET @Index = @Index + 1 
END 

return @OutputString 

end 
GO 

So PRINT dbo.f_camel_exc_short_words ('PIONEER EURO BOND FUND CLASS C (NON-DIST) (EUR) (OFFSHORE) ISIN LU0119429891',4) kehrt Pioneer EURO BOND FUND der Klasse C (NON-Dist) (EUR) (Offshore) ISIN LU0119429891

Hoffe es hilft.

0

Versuchen Sie folgendes:

declare @word as nvarchar (50) 
set @word = 'ABC COMPANY' 
select upper(left(@word, 1)) + lower(SUBSTRING(@word,2,charindex(' ', @word)-2)) + ' ' + 
upper(left(substring(@word,charindex(' ', @word)+1,len(@word)-1),1)) 
+ lower(SUBSTRING(@word,charindex(' ', @word)+2, len(@word))) 
0

Eine weitere Modifikation behandelt Possessivpronomen ('s) und Wörter mit Mc Start

if ' ' + @OutputString like '% Mc%' 
set @OutputString = ' ' + @OutputString 
set @index = CHARINDEX (' Mc', @OutputString) 
while @Index > 0 
begin 
    set @OutputString = SUBSTRING(@outputString, 1, @index + 2) + UPPER(SUBSTRING(@outputString, @index + 3, 1)) + SUBSTRING(@outputString, @index + 4, len(@outputString)) 
    set @index = CHARINDEX (' Mc', @OutputString, @Index + 4) 
end 
set @outputstring = ltrim(rtrim(@outputstring)) 

if @OutputString + ' ' like '%''S %' 
set @OutputString = ltrim(rtrim(REPLACE(@outputstring + ' ', '''S ', '''s '))) 

Platz direkt vor der Rückkehr

-1
CREATE FUNCTION Initcap 
(@mystring varchar(50)) 
RETURNS VARCHAR(50) 
AS 
BEGIN 
    DECLARE @val VARCHAR(50); 
    SET @val = (select upper(left(@mystring,1)) + lower(substring(@mystring,2,datalength(@mystring)-1))) 
    RETURN @val; 
END; 
+0

Es ist besser, einige Kontext/Erklärung umgebenden Code zu enthalten, da dies die Antwort für das OP und zukünftige Leser nützlicher macht (vor allem, da dies eine alte Frage mit mehreren hochwertigen Antworten ist). Stellen Sie sicher, dass Sie das Codeformatierungsfeature verwenden (lassen Sie eine Leerzeile und dann um vier Leerzeichen einrücken), um die Lesbarkeit zu verbessern. – EJoshuaS