web-dev-qa-db-fra.com

Comment mettre à jour les données en tant que première lettre majuscule avec la commande t-sql?

J'ai une table sur ma base de données. Le nom de ma table est "Société". Je souhaite modifier les données "nom_entreprise" en première lettre majuscule. Par exemple;

"COMPAGNIE ABC"

"DEF PLASTICITE"

comme

"Abc Company"

"Déf Plasticité"

Je sais que je devrais utiliser la commande "UPDATE". Mais comment? Merci de votre aide!

(CONCAT ne fonctionne pas)

17
cethint

SQL Server Ne pas avoir la fonction Initcap comme Oracle.

Vous pouvez créer UDF pour 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

Vérification du fonctionnement des fonctions définies par l'utilisateur

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

Stackoverflow Com

vous pouvez mettre à jour votre table comme ça

update table
set column=[dbo].[InitCap](column);
24
mr_eclair
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

Exemple en direct à SQL Fiddle.

7
Andomar

Avec un peu d'aide d'une fonction split comme celle-ci .

Essayez ceci, remplacez YourTable par le nom de votre table:

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)
1
Mikael Eriksson

Une autre modification concerne les possessifs (s) et les mots commençant par 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 ')))

placer juste avant le retour

0
Bruce Sheffer

Avec un endettement vis-à-vis du poste ci-dessus, cette fonction met en majuscule la première lettre de chaque mot, à l'exception de ceux dont la longueur est inférieure à une certaine longueur de caractères, qui sont supposés être des acronymes. Si ce n'est pas un problème, vous définissez le deuxième argument sur 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
 </ code>

Donc, PRINT dbo.f_camel_exc_short_words ('Pioneer EURO BOND FUND CLASS C (NON-DIST) (EUR) (OFFSHORE) ISIN LU0119429891',4) renvoie Fonds Pioneer EURO OBL. Classe C (Non Dist.) (EUR) (Offshore) ISIN LU0119429891

J'espère que ça aide.

0
BrownsFan

Essaye ça:

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
Myk Syk