如何在大写字母来的字符串或真正需要空格的字符串中预先添加空格。
示例代码为:
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
答案 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)
现在可以以从行到单列值的方式连接字符串值。 我们可以使用任何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
答案 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