如何在大写字母来的字符串中或者真正需要空格的地方添加空格

时间:2013-09-16 16:14:15

标签: sql-server

如何在大写字母来的字符串或真正需要空格的字符串中预先添加空格。

示例代码为:

DECLARE @teams TABLE (Team NVARCHAR(100))

INSERT INTO @teams
SELECT 'TataConsultencyServices'
UNION ALL
SELECT 'TataConsultencyCompany'
UNION ALL
SELECT 'CompanyHumanResource'

预期结果

Tata Consultency Services
Tata Consultency Company
Company Human Resource

3 个答案:

答案 0 :(得分:0)

您可以从this获得一些帮助: -

CREATE FUNCTION CaseSensitiveSQLSplitFunction
(
 @str nvarchar(max)
)
returns @t table (val nvarchar(max))
as
begin

declare @i int, @j int
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
   insert into @t (val) select @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
 insert into @t (val) select @w

return

end

将样本作为: -

declare @str nvarchar(max) = N'ThisIsATest'
select * from dbo.CaseSensitiveSQLSplitFunction(@str)
set @str = N'ThisIsASqlServerCaseSensitiveSplitStringFunction'
select * from dbo.CaseSensitiveSQLSplitFunction(@str)

enter image description here

现在可以以从行到单列值的方式连接字符串值。 我们可以使用任何sql连接函数。

declare @str nvarchar(max) = N'ThisIsATest'
SELECT LTRIM(STUFF((
  SELECT ' ' + val FROM dbo.CaseSensitiveSQLSplitFunction(@str) FOR XML PATH('')
  ), 1, 1, '')) string

set @str = N'ThisIsASqlServerCaseSensitiveSplitStringFunction'
SELECT LTRIM(STUFF((
  SELECT ' ' + val FROM dbo.CaseSensitiveSQLSplitFunction(@str) FOR XML PATH('')
  ), 1, 1, '')) string

enter image description here

答案 1 :(得分:0)

基于集合的解决方案:

DECLARE @s NVARCHAR(100);
SET @s = 'CompanyHumanResources';

DECLARE @Idx INT = 1;
WITH CteRecursive
AS
(
    SELECT  1 AS Idx, 
            CONVERT(NVARCHAR(200), @s) AS String
    UNION ALL
    SELECT  src.Idx + src.IsUpper + 1,
            CONVERT(NVARCHAR(200),
                CASE WHEN src.IsUpper = 1 THEN STUFF(src.String, src.Idx+1, 0, ' ') ELSE src.String END
            )
    FROM
    (
        SELECT  rec.*,
                CASE WHEN SUBSTRING(rec.String, rec.Idx, 1) <> ' ' AND SUBSTRING(rec.String, rec.Idx+1, 1) LIKE '[A-Z]' AND SUBSTRING(rec.String, rec.Idx+1, 1) COLLATE Romanian_CS_AS = UPPER(SUBSTRING(rec.String, rec.Idx+1, 1)) COLLATE Romanian_CS_AS THEN 1 ELSE 0 END AS IsUpper
        FROM    CteRecursive rec
        WHERE   rec.Idx + 1 <= LEN(rec.String)
    ) src
)
SELECT  TOP(1) x.String
FROM    CteRecursive x
ORDER BY x.Idx DESC;

结果:

String
-----------------------
Company Human Resources

答案 2 :(得分:0)

WHILE 1 = 1 开始               更新@teams               SET TeamName = STUFF(TeamName,patindex('%[a-z,。] [A-Z]%',TeamName COLLATE Latin1_General_BIN)+ 1,0,'')               patindex('%[a-z,。] [A-Z]%',TeamName COLLATE Latin1_General_BIN)&gt; 0

          IF @@ROWCOUNT = 0 BREAK

END

更新@teams SET TeamName = STUFF(TeamName,patindex('%[A-Z] [a-z]%',RIGHT(TeamName,LEN(TeamName)-1)COLLATE Latin1_General_BIN)+ 1,0,'') patindex('%[A-Z] [a-z]%',TeamName COLLATE Latin1_General_BIN)&gt; 0