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)
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);
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
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)
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
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.
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)))