2010-12-31 29 views
10

La pregunta se explica por sí misma. Podría indicar una forma de poner espacios entre cada letra mayúscula de una cadena.Espacio T-SQL antes de Mayúsculas

SELECT dbo.SpaceBeforeCap('ThisIsATestString') 

daría lugar a

This Is A Test String. 

Respuesta

6

Suponiendo SQL Server 2005 o posterior, esta modificación de código tomado aquí: http://www.kodyaz.com/articles/case-sensitive-sql-split-function.aspx

CREATE FUNCTION SpaceBeforeCap 
(
@str nvarchar(max) 
) 
returns nvarchar(max) 
as 
begin 

declare @i int, @j int 
declare @returnval nvarchar(max) 
set @returnval = '' 
select @i = 1, @j = len(@str) 

declare @w nvarchar(max) 

while @i <= @j 
begin 
if substring(@str,@i,1) = UPPER(substring(@str,@i,1)) collate Latin1_General_CS_AS 
begin 
    if @w is not null 
    set @returnval = @returnval + ' ' + @w 
    set @w = substring(@str,@i,1) 
end 
else 
    set @w = @w + substring(@str,@i,1) 
set @i = @i + 1 
end 
if @w is not null 
set @returnval = @returnval + ' ' + @w 

return ltrim(@returnval) 

end 

Esto entonces se puede llamar al igual que usted ha sugerido anteriormente.

+1

Esto supone que los datos no contienen ningún carácter XML especial. Probablemente sea más seguro simplemente piratear la función directamente para hacer la concatenación en lugar de insertarla en una variable de tabla. –

+0

@Martin - acordado; Lo he modificado para hacer una concatenación directa. – LittleBobbyTables

1

CLR y expresiones regulares o reemplazar 26 declaraciones una cláusula de intercalación entre mayúsculas y minúsculas y un recorte.

11

Esto agregará espacios solo si el carácter anterior y el siguiente son minúsculas. De esa forma, 'MyABCAnalysis' será 'Mi análisis ABC'.

He añadido también un cheque para un espacio anterior. Dado que algunas de nuestras cadenas tienen el prefijo 'GR_' y algunos también contienen guiones, podemos utilizar la función de reemplazar la siguiente manera:

seleccione dbo.GR_SpaceBeforeCap (reemplace ('GR_ABCAnalysis_Test', '_',' ')) 'GR prueba de Análisis de ABC' regresa

CREATE FUNCTION GR_SpaceBeforeCap (
    @str nvarchar(max) 
) 
returns nvarchar(max) 
as 
begin 

declare 
    @i int, @j int 
, @cp nchar, @c0 nchar, @c1 nchar 
, @result nvarchar(max) 

select 
    @i = 1 
, @j = len(@str) 
, @result = '' 

while @i <= @j 
begin 
    select 
     @cp = substring(@str,@i-1,1) 
    , @c0 = substring(@str,@i+0,1) 
    , @c1 = substring(@str,@i+1,1) 

    if @c0 = UPPER(@c0) collate Latin1_General_CS_AS 
    begin 
     -- Add space if Current is UPPER 
     -- and either Previous or Next is lower 
     -- and Previous or Current is not already a space 
     if @c0 = UPPER(@c0) collate Latin1_General_CS_AS 
     and (
       @cp <> UPPER(@cp) collate Latin1_General_CS_AS 
      or @c1 <> UPPER(@c1) collate Latin1_General_CS_AS 
     ) 
     and @cp <> ' ' 
     and @c0 <> ' ' 
      set @result = @result + ' ' 
    end -- if @co 

    set @result = @result + @c0 
    set @i = @i + 1 
end -- while 

return @result 
end 
+0

Esto funciona para mí y para mi entorno heterogéneo donde tenemos nombres de estilo Oracle mezclados con Camel Case. A menudo terminamos con una combinación de nombres de objetos UNDERSCORES_and_FirstLetterCapitalized. –

1

Otra estrategia sería la de comprobar el valor ASCII de cada carácter:

create function SpaceBeforeCap 
(@str nvarchar(max)) 
returns nvarchar(max) 
as 
begin 
    declare @result nvarchar(max)= left(@str, 1), 
      @i int = 2 

    while @i <= len(@str) 
    begin 
    if ascii(substring(@str, @i, 1)) between 65 and 90 
     select @result += ' ' 
    select @result += substring(@str, @i, 1) 
    select @i += 1 
    end 

    return @result 
end 

/*** 
    SELECT dbo.SpaceBeforeCap('ThisIsATestString') 
**/ 
3

Esta función combina las respuestas anteriores. Elija de forma selectiva para conservar MAYÚSCULAS adyacentes:

CREATE FUNCTION SpaceBeforeCap (
    @InputString NVARCHAR(MAX), 
    @PreserveAdjacentCaps BIT 
) 
RETURNS NVARCHAR(MAX) 
AS 
BEGIN 

DECLARE 
    @i INT, @j INT, 
     @previous NCHAR, @current NCHAR, @next NCHAR, 
     @result NVARCHAR(MAX) 

SELECT 
    @i = 1, 
     @j = LEN(@InputString), 
     @result = '' 

WHILE @i <= @j 
BEGIN 
    SELECT 
     @previous = SUBSTRING(@InputString,@i-1,1), 
       @current = SUBSTRING(@InputString,@i+0,1), 
       @next = SUBSTRING(@InputString,@i+1,1) 

    IF @current = UPPER(@current) COLLATE Latin1_General_CS_AS 
    BEGIN 
     -- Add space if Current is UPPER 
     -- and either Previous or Next is lower or user chose not to preserve adjacent caps 
     -- and Previous or Current is not already a space 
     IF @current = UPPER(@current) COLLATE Latin1_General_CS_AS 
     AND (
          @previous <> UPPER(@previous) COLLATE Latin1_General_CS_AS 
          OR @next <> UPPER(@next) collate Latin1_General_CS_AS 
          OR @PreserveAdjacentCaps = 0 
     ) 
     AND @previous <> ' ' 
     AND @current <> ' ' 
      SET @result = @result + ' ' 
    END 

    SET @result = @result + @current 
    SET @i = @i + 1 
END 

RETURN @result 
END 

GO 
SELECT dbo.SpaceBeforeCap('ThisIsASampleDBString', 1) 
GO 
SELECT dbo.SpaceBeforeCap('ThisIsASampleDBString', 0) 
Cuestiones relacionadas