遍历 table 并更新特定列

Loop through table and update a specific column

我有以下 table:

Id Category
1 some thing
2 value

这个 table 包含很多行,我想要做的是更新所有类别值以将每个首字母更改为大写。例如,some thing 应该是 Some Thing.

目前我拥有的是:

UPDATE MyTable
    SET Category = (SELECT UPPER(LEFT(Category,1))+LOWER(SUBSTRING(Category,2,LEN(Category))) FROM MyTable WHERE Id = 1)
WHERE Id = 1;

但是有两个问题,第一个是尝试将类别值更改为上限,因为只适用于 1 len 个单词(hello=> Hello,hello world => Hello world),第二个是我需要按照 Where Id = X 逻辑 运行 此查询 X 次。所以我的问题是如何更新 X 行?我一直在用光标思考,但我没有太多经验。

这里有一个 fiddle 可以玩。

您可以将单词分开,应用大写字母,然后将单词重新组合在一起。不,您不应该担心子查询和 Id 因为您应该始终将 更新一组行 作为 set-based 操作而不是一次更新一行时间.

;WITH cte AS
(
  SELECT Id, NewCat = STRING_AGG(CONCAT(
    UPPER(LEFT(value,1)),
    SUBSTRING(value,2,57)), ' ') 
    WITHIN GROUP (ORDER BY CHARINDEX(value, Category))
  FROM 
  (
    SELECT t.Id, t.Category, s.value 
    FROM dbo.MyTable AS t
    CROSS APPLY STRING_SPLIT(Category, ' ') AS s
  ) AS x GROUP BY Id
)
UPDATE t
  SET t.Category = cte.NewCat
  FROM dbo.MyTable AS t
  INNER JOIN cte ON t.Id = cte.Id;

这假设您的类别中没有 non-consecutive 重复项;例如,bora frickin bora 会搞砸(同时 bora bora fickin 会很好)。它还假设一个不区分大小写的排序规则(如果需要可以满足)。

在 Azure SQL 数据库中,您可以使用 STRING_SPLIT() 的新 enable_ordinal 参数,但目前,您必须依赖 CHARINDEX() 等技巧。

  • 已更新db<>fiddle(感谢您抢先一步!)