Sql server 在大写字母出现或真正需要空格的地方,如何在字符串中预加空格
在大写字母出现或真正需要空格的地方,如何在字符串中预加空格 示例代码是:Sql server 在大写字母出现或真正需要空格的地方,如何在字符串中预加空格,sql-server,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
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
您肯定会从以下方面获得一些帮助:- 现在可以用sql将字符串值从行连接到单列值。 我们可以只使用任何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
基于集合的解决方案:
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;
而1=1
开始
更新@teams
SET TeamName=STUFF(TeamName,patindex('%[a-z,.][a-z]]',TeamName COLLATE拉丁语1\u General\u BIN)+1,0',)
其中patindex('%[a-z,.][a-z]'、TeamName COLLATE Latin1\u General\u BIN)>0
结束
更新@teams
SET TeamName=STUFF(TeamName,patindex('%[A-Z][A-Z]]',右(TeamName,LEN(TeamName)-1)对照拉丁语1\u General\u BIN)+1,0',)
如果patindex('%[A-Z][A-Z]',TeamName COLLATE Latin1\u General\u BIN)>0您应该用区分大小写的(
…\u CS\u…
)替换我的排序规则()排序规则。很好,但我不得不说,我不能自己做这个查询逻辑,所以我正在搜索新的简单逻辑,如果我能得到它,就会发布它,但这对“TCSolutions”这样的参数不起作用,它会返回像TCSolutions这样的结果,这实际上是不需要的。这是缩进行为。你的问题中没有这样的要求。谢谢你,伙计,这有助于你了解更多关于区分大小写的事情。欢迎你。如果姚认为答案值得的话,请投上一票
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
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
IF @@ROWCOUNT = 0 BREAK