我最终自己解决了这个问题。这是我的解决方案以供将来参考:
我以deadbeef-0000-0000-0000- 的形式创建 GUID 的前缀部分,然后将 Id 列的整数值的“字符串化”、零填充版本附加到它,例如 000000000001,结果是
DEADBEEF-0000-0000-0000-000000000001
在这个例子中。
这是对整个表执行此操作的 SQL 命令:
-- Deterministically creates a uniqueidentifier value out of an integer value.
DECLARE @GuidPrefix nvarchar(max) = N'deadbeef-0000-0000-0000-'; -- without the last 12 digits
UPDATE Unit
SET UniqueColumn =
(SELECT @GuidPrefix + RIGHT('000000000000' + CAST(IntegerId AS NVARCHAR (12)), 12 ) AS NUMBER_CONVERTED)
警告:
- 此实现仅适用于正 int 值(向上
最大为 2147483647)
- 这仅用于测试数据!用途是
强烈反对生产数据!
这是一个完整的工作示例:
-- Create an example table with random GUID's
CREATE TABLE Unit
(
UniqueColumn UNIQUEIDENTIFIER DEFAULT NEWID(),
Characters VARCHAR(10),
IntegerId int
)
-- Add 2 data rows
INSERT INTO Unit(Characters, IntegerId) VALUES ('abc', 1111)
INSERT INTO Unit(Characters, IntegerId) VALUES ('def', 2222)
-- Deterministically creates a uniqueidentifier value out of an integer value.
DECLARE @GuidPrefix nvarchar(max) = N'deadbeef-0000-0000-0000-'; -- without the last 12 digits
UPDATE Unit
SET UniqueColumn =
(SELECT @GuidPrefix + RIGHT('000000000000' + CAST(IntegerId AS NVARCHAR (12)), 12 ) AS NUMBER_CONVERTED)
-- Check the result
SELECT * FROM Unit
结果:
UniqueColumn Characters IntegerId
--------------------------------------- ---------- ---------
DEADBEEF-0000-0000-0000-000000001111 abc 1111
DEADBEEF-0000-0000-0000-000000002222 def 2222