2008-09-10 6 views
34

Quelle est la meilleure façon de mettre en majuscule la première lettre de chaque mot d'une chaîne dans SQL Server.Quelle est la meilleure façon de mettre en majuscule la première lettre de chaque mot d'une chaîne dans SQL Server

+0

Est-ce que cela a à faire dans SQL Server? Ce n'est pas quelque chose que j'associerais avec un serveur de base de données, mais quelque chose fait par validation de formulaire ou même une vue. –

+0

Utilisateurs de PostgreSQL: UPDATE [table] SET your_col = initcap (lower (your_col)); Ce n'est pas une question Postgre, mais il apparaît d'abord dans google indépendamment. –

Répondre

64

De http://www.sql-server-helper.com/functions/initcap.aspx

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 

Il est un simple/plus petit ici (mais ne fonctionne pas si aucune ligne ne pas les espaces, « paramètre de longueur non valide transmis à la fonction DROITE. »):

http://www.devx.com/tips/Tip/17608

+0

que signifie le mot UPPER (@Char)! = 'S'? pourquoi nous utilisons cela? – Sharique

+1

La comparaison avec 'S' est de s'assurer que le S n'est pas en majuscule lors de l'écriture de mots comme 'that's' – Espo

+0

Merci, ça m'a aidé! –

0

une variante de celui que je sers depuis un certain temps est:

CREATE FUNCTION [widget].[properCase](@string varchar(8000)) RETURNS varchar(8000) AS 
BEGIN 
    SET @string = LOWER(@string) 
    DECLARE @i INT 
    SET @i = ASCII('a') 
    WHILE @i <= ASCII('z') 
    BEGIN 
     SET @string = REPLACE(@string, ' ' + CHAR(@i), ' ' + CHAR(@i-32)) 
     SET @i = @i + 1 
    END 
    SET @string = CHAR(ASCII(LEFT(@string, 1))-32) + RIGHT(@string, LEN(@string)-1) 
    RETURN @string 
END 

Vous pouvez facilement modifier pour gérer les caractères après les éléments autres que des espaces si vous le souhaitez.

1

Une autre solution sans utiliser la boucle - approche basée sur le jeu pur avec CTE récursive

create function [dbo].InitCap (@value varchar(max)) 
returns varchar(max) as 
begin 

    declare 
     @separator char(1) = ' ', 
     @result varchar(max) = ''; 

    with r as (
     select value, cast(null as varchar(max)) [x], cast('' as varchar(max)) [char], 0 [no] from (select rtrim(cast(@value as varchar(max))) [value]) as j 
     union all 
     select right(value, len(value)-case charindex(@separator, value) when 0 then len(value) else charindex(@separator, value) end) [value] 
     , left(r.[value], case charindex(@separator, r.value) when 0 then len(r.value) else abs(charindex(@separator, r.[value])-1) end) [x] 
     , left(r.[value], 1) 
     , [no] + 1 [no] 
     from r where value > '') 

    select @result = @result + 
    case 
     when ascii([char]) between 97 and 122 
      then stuff(x, 1, 1, char(ascii([char])-32)) 
     else x 
    end + @separator 
    from r where x is not null; 

    set @result = rtrim(@result); 

    return @result; 
end 
0

Voici le code à une ligne simple.

select 
     LEFT(column, 1)+ lower(RIGHT(column, len(column)-1)) 
    from [tablename] 
+0

Notez, chaque colonne doit être rognée d'espaces ou cette casse. – JohnnyBizzle

+1

Aussi, vous ne faites pas Upper sur la première lettre. – JohnnyBizzle

+0

Ceci met uniquement en majuscule la première lettre de la colonne – slayernoah

-1

Vous devriez essayer au lieu

Select INITCAP(column_name) from table_name; 

Cela Capitaliser la première lettre d'entrées mentionnées attributs.

+2

" INITCAP "n'est pas une fonction intégrée - vous devez fournir la définition de la fonction. – chazbot7

+0

J'utilise INITCAP dans Oracle MYSQL et cela fonctionne absolument bien –

+4

Oui, mais la question précise SQL Server. – chazbot7

0

En fonction de table d'une valeur:

CREATE FUNCTION dbo.InitCap(@v AS VARCHAR(MAX)) 
RETURNS TABLE 
AS 
RETURN 
WITH a AS (
    SELECT (
     SELECT UPPER(LEFT(value, 1)) + LOWER(SUBSTRING(value, 2, LEN(value))) AS 'data()' 
     FROM string_split(@v, ' ') 
     FOR XML PATH (''), TYPE) ret) 

SELECT CAST(a.ret AS varchar(MAX)) ret from a 
GO 

Notez que string_split nécessite COMPATIBILITY_LEVEL 130.

0
BEGIN 
DECLARE @string varchar(100) = 'asdsadsd asdad asd' 
DECLARE @ResultString varchar(200) = '' 
DECLARE @index int = 1 
DECLARE @flag bit = 0 
DECLARE @temp varchar(2) = '' 
WHILE (@Index <LEN(@string)+1) 
BEGIN 
    SET @temp = SUBSTRING(@string, @Index-1, 1) 
    --select @temp 
    IF @temp = ' ' OR @index = 1 
     BEGIN 
      SET @ResultString = @ResultString + UPPER(SUBSTRING(@string, @Index, 1)) 
     END 
    ELSE 
     BEGIN 

      SET @ResultString = @ResultString + LOWER(SUBSTRING(@string, @Index, 1)) 
     END 

    SET @Index = @Index+ 1--increase the index 
END 
SELECT @ResultString 

FIN

+0

Façon très simple de mettre en majuscule le premier caractère dans SQL Server –

Questions connexes