sql-server - 使用唯一 ID 更新数千条 SQL 记录的脚本
问题描述
我有一个名为“users”的表,其中包含 5800 条记录,其中 externalID 为 NULL。我想以下列格式为每个记录添加一个唯一的 externalID:“legacy_N”,其中 N 是 1 到 5800 之间的某个数字。
这个:
ID externalID Name AddedUTC
123 John 2019-09-19 15:14:11.837
634 Susan 2019-09-18 20:39:38.247
499 Lolita 2019-09-18 19:58:29.320
...
变成这样:
ID externalID Name AddedUTC
123 legacy_1 John 2019-09-19 15:14:11.837
634 legacy_2 Susan 2019-09-18 20:39:38.247
499 legacy_3 Lolita 2019-09-18 19:58:29.320
...
无论如何我可以以编程方式做到这一点?还是我要花 8 个小时来一一更新这些?
解决方案
这是基于您问题中的数据的示例:
-- Create a test table with test data in it
CREATE TABLE TestData([ID] int, [externalID] varchar(20), [Name] varchar(50), [AddedUTC] datetime);
INSERT INTO TestData ([ID], [externalID], [Name], [AddedUTC])
VALUES (123, NULL, 'John', '2019-09-19 15:14:11.837'),
(499, NULL, 'Lolita', '2019-09-18 19:58:29.320'),
(634, NULL, 'Susan', '2019-09-18 20:39:38.247');
-- Display the test data
SELECT * FROM TestData;
-- Do the update
WITH NumberedData AS (
SELECT ID, ROW_NUMBER() OVER (ORDER BY AddedUTC) AS RowNum
FROM TestData
)
UPDATE td
SET [externalID] = 'Legacy_' + CAST(RowNum AS varchar)
FROM TestData td
INNER JOIN NumberedData nd ON td.ID = nd.ID
-- Display updated data
SELECT * FROM TestData;
如果您想按 ID 排序,则可以将 ROW_NUMBER 子句改为“OVER(ORDER BY ID)”。
推荐阅读
- node.js - 如何创建过期令牌firebase云功能?
- batch-file - 我可以在 WinSCP 批处理脚本中引用批处理文件目录吗?
- java - Repaint() 或 Revalidate() 在我的代码中不起作用
- c# - 在 for 循环期间创建的操作委托在用作委托方法中的参数时不尊重“for 变量”值
- javascript - 将 Figma CSS 转换为 Vue.js 组件 - 这里的最佳实践是什么?
- python - 使用 2 参数形式调用 super() 与直接引用方法并手动传入“self”有何不同?
- unity3d - Unity WebGL 移动浏览器解决方法和键盘输入修复?
- python - 如果我们用一个特征训练模型,则查找数据帧高的特征给出最小的错误
- css - “网格模板列:适合内容(50%)1fr;” 没有按预期工作
- javascript - 在javascript,nodejs中解码base64数据