SQL:仅首字母大写

我需要一个SQL语句来大写每个单词的第一个字母。 其他字符必须小写。

这个词可以是这样的:

wezembeek-oppem roeselare BRUGGE louvain-la-neuve 

这将是:

 Wezembeek-Oppem Roeselare Brugge Louvain-La-Neuve 

这应该是一个UPDATE语句,我想更新一列的数据。 非常感谢你的回答,我是一个SQL新手。

你是要求重命名列本身还是大写列中的数据? 如果它的数据你必须改变,然后使用这个:

 UPDATE [yourtable] SET word=UPPER(LEFT(word,1))+LOWER(SUBSTRING(word,2,LEN(word))) 

如果您只是想将其更改为仅用于显示而不需要表中的实际数据更改:

 SELECT UPPER(LEFT(word,1))+LOWER(SUBSTRING(word,2,LEN(word))) FROM [yourtable] 

希望这可以帮助。

编辑:我意识到' – '所以这里是我的尝试解决这个问题的function。

 CREATE FUNCTION [dbo].[CapitalizeFirstLetter] ( --string need to format @string VARCHAR(200)--increase the variable size depending on your needs. ) RETURNS VARCHAR(200) AS BEGIN --Declare Variables DECLARE @Index INT, @ResultString VARCHAR(200)--result string size should equal to the @string variable size --Initialize the variables SET @Index = 1 SET @ResultString = '' --Run the Loop until END of the string WHILE (@Index <LEN(@string)+1) BEGIN IF (@Index = 1)--first letter of the string BEGIN --make the first letter capital SET @ResultString = @ResultString + UPPER(SUBSTRING(@string, @Index, 1)) SET @Index = @Index+ 1--increase the index END -- IF the previous character is space or '-' or next character is '-' ELSE IF ((SUBSTRING(@string, @Index-1, 1) =' 'or SUBSTRING(@string, @Index-1, 1) ='-' or SUBSTRING(@string, @Index+1, 1) ='-') and @Index+1 <> LEN(@string)) BEGIN --make the letter capital SET @ResultString = @ResultString + UPPER(SUBSTRING(@string,@Index, 1)) SET @Index = @Index +1--increase the index END ELSE-- all others BEGIN -- make the letter simple SET @ResultString = @ResultString + LOWER(SUBSTRING(@string,@Index, 1)) SET @Index = @Index +1--incerase the index END END--END of the loop IF (@@ERROR <> 0)-- any error occur return the sEND string BEGIN SET @ResultString = @string END -- IF no error found return the new string RETURN @ResultString END 

那么代码将是:

 UPDATE [yourtable] SET word=dbo.CapitalizeFirstLetter([STRING TO GO HERE]) 

创build下面的函数

 Alter FUNCTION InitialCap(@String VARCHAR(8000)) RETURNS VARCHAR(8000) AS BEGIN DECLARE @Position INT; SELECT @String = STUFF(LOWER(@String),1,1,UPPER(LEFT(@String,1))) COLLATE Latin1_General_Bin, @Position = PATINDEX('%[^A-Za-z''][az]%',@String COLLATE Latin1_General_Bin); WHILE @Position > 0 SELECT @String = STUFF(@String,@Position,2,UPPER(SUBSTRING(@String,@Position,2))) COLLATE Latin1_General_Bin, @Position = PATINDEX('%[^A-Za-z''][az]%',@String COLLATE Latin1_General_Bin); RETURN @String; END ; 

然后像这样称呼它

 select dbo.InitialCap(columnname) from yourtable 

请检查查询,而不使用函数:

 declare @T table(Insurance varchar(max)) insert into @T values ('wezembeek-oppem') insert into @T values ('roeselare') insert into @T values ('BRUGGE') insert into @T values ('louvain-la-neuve') select ( select upper(TNvalue('.', 'char(1)'))+ lower(stuff(TNvalue('.', 'varchar(max)'), 1, 1, ''))+(CASE WHEN RIGHT(TNvalue('.', 'varchar(max)'), 1)='-' THEN '' ELSE ' ' END) from X.InsXML.nodes('/N') as T(N) for xml path(''), type ).value('.', 'varchar(max)') as Insurance from ( select cast('<N>'+replace( replace( Insurance, ' ', '</N><N>'), '-', '-</N><N>')+'</N>' as xml) as InsXML from @T ) as X 
 select replace(wm_concat(new),',','-') exp_res from (select distinct initcap(substr(name,decode(level,1,1,instr(name,'-',1,level-1)+1),decode(level,(length(name)-length(replace(name,'-','')))+1,9999,instr(name,'-',1,level)-1-decode(level,1,0,instr(name,'-',1,level-1))))) new from table; connect by level<= (select (length(name)-length(replace(name,'-','')))+1 from table));