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