2012-07-27 7 views
17

Ho una tabella sul mio database. Il nome del mio tavolo è "Company". Voglio cambiare i dati "company_name" come prima lettera maiuscola. Per esempio;Come aggiornare i dati come maiuscole in maiuscolo con il comando t-sql?

"ABC COMPANY"

"DEF PLASTICITÀ"

come

"Abc Company"

"Def plasticità"

So che dovrei usare "UPDATE" comando. Ma come? Grazie per l'aiuto!

(CONCAT non funziona)

+3

Ciò che si descrive è chiamato "Title Case" ed è discusso qui: http://stackoverflow.com/questions/9595356/proper-title-case-in-t-sql – Brian

risposta

24

SQL Server Non ce l'ho Initcap funzione come oracolo.

È possibile creare UDF per Initcap.

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 

Controllo per UDF lavorare

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

Stackoverflow Com 

è possibile aggiornare il tavolo come questo

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

Grazie, funziona con successo. – cethint

+0

@cethint felice di aiutarti! –

+3

È fantastico! Mi ha salvato un sacco di tempo! Grazie! – 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 in tal caso si imposta solo la prima lettera maiuscola.Il SO vuole la prima lettera di ogni parola capitale per quanto posso dire che il primo caso della prima parola è il minuscolo –

+0

. Voglio fare tutte le parole 'i primi casi devono essere maiuscoli. – cethint

+0

In questo caso, controlla [link di rhooligan] (http://classicasp.aspfaq.com/general/how-do-i-convert-a-name-to-proper-case.html) – Andomar

1

Con un piccolo aiuto di una funzione split come this one.

Prova questo, sostituire YourTable con qualunque sia il vostro nome della tabella è:

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

Ma questo è solo 2 esempi. Ho molti dati sul tavolo. Non posso cambiare uno per uno o meccanico. – cethint

+0

Ok, ho rimosso la roba che era lì per essere in grado di testarlo. –

+0

Devi anche cambiare ''varchar (50)'' in qualunque tipo di dati sia la tua colonna Nome. –

0

Con indebitamento al post di cui sopra, questa funzione maiuscola la prima lettera di ogni parola ad eccezione di quelli che sono meno di una certa lunghezza di carattere, che si presume siano acronimi. Se questo è nessun problema, poi si imposta il secondo argomento a 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 

Così PRINT dbo.f_camel_exc_short_words ('PIONEER EURO BOND FUND CLASS C (NON-DIST) (EUR) (OFFSHORE) ISIN LU0119429891',4) rendimenti Pioneer EURO BOND FUND Classe C (NON-Dist) (EUR) (in mare aperto) ISIN LU0119429891

Spero che aiuti.

0

Prova questo:

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

un'ulteriore modifica gestisce possessivi ('s) e parole che iniziano con Mc

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 '))) 

posto giusto prima di ritorno

-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

È preferibile includere un contesto/spiegazione del codice circostante che renda la risposta più utile all'OP e ai futuri lettori (soprattutto perché questa è una vecchia domanda con diverse risposte di alta qualità). Inoltre, assicurati di utilizzare la funzione di formattazione del codice (lasciare una riga vuota e quindi indentare di quattro spazi) per migliorare la leggibilità. – EJoshuaS