J'ai une table sur ma database. Le nom de ma table est "Société". Je veux changer datatables "company_name" en majuscule première lettre. Par exemple;
"ABC COMPANY"
"PLASTICITÉ DEF"
comme
"Compagnie Abc"
"Def Plasticité"
Je sais que je devrais utiliser la command "UPDATE". Mais comment? Merci de votre aide!
(CONCAT ne fonctionne pas)
SQL Server Initcap
fonction Initcap
comme Oracle.
Vous pouvez créer une fonction UDF pour Initcap.
CREATE FUNCTION [dbo].[InitCap] ( @InputSsortingng varchar(4000) ) RETURNS VARCHAR(4000) AS BEGIN DECLARE @Index INT DECLARE @Char CHAR(1) DECLARE @PrevChar CHAR(1) DECLARE @OutputSsortingng VARCHAR(255) SET @OutputSsortingng = LOWER(@InputSsortingng) SET @Index = 1 WHILE @Index <= LEN(@InputSsortingng) BEGIN SET @Char = SUBSTRING(@InputSsortingng, @Index, 1) SET @PrevChar = CASE WHEN @Index = 1 THEN ' ' ELSE SUBSTRING(@InputSsortingng, @Index - 1, 1) END IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(') BEGIN IF @PrevChar != '''' OR UPPER(@Char) != 'S' SET @OutputSsortingng = STUFF(@OutputSsortingng, @Index, 1, UPPER(@Char)) END SET @Index = @Index + 1 END RETURN @OutputSsortingng END GO
Vérification du fonctionnement de l'UDF
select [dbo].[InitCap] ('stackoverflow com'); Stackoverflow Com
vous pouvez mettre à jour votre tableau comme ça
update table set column=[dbo].[InitCap](column);
update YourTable set company_name = upper(subssortingng(company_name,1,1)) + lower(subssortingng(company_name, 2, len(company_name)-1)) where len(company_name) > 0
Exemple live à SQL Fiddle.
Avec un peu d'aide d'une fonction split comme celle-ci .
Essayez ceci, remplacez YourTable
avec le nom de votre table:
update T set Name = P.Name from YourTable as T cross apply (select (select upper(left(Xs, 1))+lower(stuff(Xs, 1, 1, ''))+' ' from dbo.split(' ', Name) as X for xml path(''), type).value('.', 'varchar(50)') ) as P(Name)
Avec l'endettement au post ci-dessus, cette fonction met en majuscule la première lettre de chaque mot à l'exception de ceux qui sont inférieurs à une certaine longueur de caractère, qui sont supposés être des acronymes. Si ce n'est pas un problème, alors vous définissez le deuxième argument à 0.
CREATE function [dbo].[f_camel_exc_short_words] (@InputSsortingng 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 @OutputSsortingng VARCHAR(255) DECLARE @WordIndex INT SET @Word = '' SET @OutputSsortingng = '' SET @Index = 1 WHILE @Index <= LEN(@InputSsortingng)+1 BEGIN SET @Char = SUBSTRING(@InputSsortingng, @Index, 1) SET @PrevChar = CASE WHEN @Index = 1 THEN ' ' ELSE SUBSTRING(@InputSsortingng, @Index - 1, 1) END --IF @Char IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(') -- SET @OutputSsortingng = @OutputSsortingng + @Char IF @PrevChar IN (' ', ';', ':', '!', '?', ',', '.', '_', '-', '/', '&', '''', '(','0','1','2','3','4','5','6','7','8','9') or @Index = LEN(@InputSsortingng)+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 @OutputSsortingng = @OutputSsortingng + @Word SET @Word = '' END SET @Word = @Word + @Char SET @Index = @Index + 1 END return @OutputSsortingng end GO
Donc PRINT dbo.f_camel_exc_short_words ('PIONEER EURO BOND FUND CLASS C (NON-DIST) (EUR) (OFFSHORE) ISIN LU0119429891',4)
Pioneer EURO BOND FUND Catégorie C (NON-Dist) (EUR) (offshore) ISIN LU0119429891
J'espère que cela 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(subssortingng(@word,charindex(' ', @word)+1,len(@word)-1),1)) + lower(SUBSTRING(@word,charindex(' ', @word)+2, len(@word)))
Une autre modification gère les possessifs (s) et les mots commençant par Mc
if ' ' + @OutputSsortingng like '% Mc%' set @OutputSsortingng = ' ' + @OutputSsortingng set @index = CHARINDEX ( ' Mc', @OutputSsortingng) while @Index > 0 begin set @OutputSsortingng = SUBSTRING(@outputSsortingng, 1, @index + 2) + UPPER(SUBSTRING(@outputSsortingng, @index + 3, 1)) + SUBSTRING(@outputSsortingng, @index + 4, len(@outputSsortingng)) set @index = CHARINDEX ( ' Mc', @OutputSsortingng, @Index + 4) end set @outputssortingng = lsortingm(rsortingm(@outputssortingng)) if @OutputSsortingng + ' ' like '%''S %' set @OutputSsortingng = lsortingm(rsortingm(REPLACE(@outputssortingng + ' ', '''S ', '''s ')))
placer juste avant le return
CREATE FUNCTION Initcap ( @myssortingng varchar(50) ) RETURNS VARCHAR(50) AS BEGIN DECLARE @val VARCHAR(50); SET @val = (select upper(left(@myssortingng,1)) + lower(subssortingng(@myssortingng,2,datalength(@myssortingng)-1)) ) RETURN @val; END;