2012-07-27 86 views
17

Tengo una tabla en mi base de datos. El nombre de mi mesa es "Empresa". Quiero cambiar los datos "nombre_empresa" como primera letra en mayúscula. Por ejemplo;¿Cómo actualizar los datos en mayúscula como primera letra con el comando t-sql?

"Compañía ABC"

la "plasticidad DEF"

como

"Compañía ABC"

"Def Plasticidad"

Sé que debo utilizar "UPDATE" mando. ¿Pero cómo? ¡Gracias por tu ayuda!

(CONCAT no funciona)

+3

Lo que usted describe se llama "Title Case" y se trata aquí: http://stackoverflow.com/questions/9595356/proper-title-case-in-t-sql – Brian

Respuesta

24

SQL Server no tiene Initcap función como oráculo.

Puede crear UDF para 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 

Comprobación de UDF trabajo

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

Stackoverflow Com 

puede actualizar su tabla de este modo

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

Gracias, funciona con éxito. – cethint

+0

@cethint encantado de ayudarte! –

+3

¡Esto es asombroso! ¡Me ahorro mucho tiempo! ¡Gracias! – 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 en eso solo se establece la primera letra capital.El SO quiere la primera letra de cada palabra capital en la medida en que puedo decir –

+0

el primer caso de la segunda palabra es minúscula. Quiero hacer todas las palabras: los primeros casos deben ser mayúsculas. – cethint

+0

En ese caso, consulte [enlace de rhooligan] (http://classicasp.aspfaq.com/general/how-do-i-convert-a-name-to-proper-case.html) – Andomar

1

Con un poco de ayuda de una función de división como this one.

Prueba de esto, reemplazar YourTable con lo que su nombre de la tabla es:

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

Pero esto es solo 2 ejemplos. Tengo muchos datos en la mesa. No puedo cambiar uno por uno o mecánico. – cethint

+0

Ok, eliminé las cosas que estaban allí para poder probar esto. –

+0

También necesita cambiar ''varchar (50) '' al tipo de datos que sea su columna Nombre. –

0

Con endeudamiento con el post anterior, esta función en mayúscula la primera letra de cada palabra salvo las que tienen menos de cierta longitud de carácter, que se supone que son acrónimos. Si eso no es problema, entonces se establece el segundo argumento 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 

Así PRINT dbo.f_camel_exc_short_words ('PIONEER EURO BOND FUND CLASS C (NON-DIST) (EUR) (OFFSHORE) ISIN LU0119429891',4) vuelve Pioneer EURO BOND Clase C (NO-Dist) (EUR) (Marino) ISIN LU0119429891

Espero que ayude.

0

Prueba esto:

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

Una modificación adicional se encarga de los posesivos ('s) y palabras que comienzan 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 '))) 

lugar correcto antes de vuelta

-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 mejor incluir algún contexto/explicación que rodee el código, ya que hace que la respuesta sea más útil para el OP y los lectores futuros (especialmente porque esta es una pregunta antigua con varias respuestas de alta calidad). Además, asegúrese de utilizar la función de formato de código (deje una línea en blanco y luego sangría por cuatro espacios) para mejorar la legibilidad. – EJoshuaS

Cuestiones relacionadas