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.
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.
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.
CLR y expresiones regulares o reemplazar 26 declaraciones una cláusula de intercalación entre mayúsculas y minúsculas y un recorte.
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
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. –
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')
**/
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)
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. –
@Martin - acordado; Lo he modificado para hacer una concatenación directa. – LittleBobbyTables