Хватит думать о проблеме с «строковой» точки зрения . int
состоит из 4 байтов. A uniqueidentifier
состоит из 16 байтов. Вы можете легко взять 12 фиксированных байтов и добавить четыре байта от int
к их окончанию, и получить решение, которое работает для всех значений int
:
declare @Unit table
(
UniqueColumn UNIQUEIDENTIFIER DEFAULT NEWID(),
Characters VARCHAR(10),
IntegerId int
)
-- Add *3* data rows
INSERT INTO @Unit(Characters, IntegerId) VALUES ('abc', 1111),('def', 2222),('ghi',-17)
-- Deterministically creates a uniqueidentifier value out of an integer value.
DECLARE @GuidPrefix binary(12) = 0xefbeadde0000000000000000
UPDATE @Unit
SET UniqueColumn = CONVERT(uniqueidentifier,@GuidPrefix + CONVERT(binary(4),IntegerId))
-- Check the result
SELECT * FROM @Unit
Результат:
UniqueColumn Characters IntegerId
------------------------------------ ---------- -----------
DEADBEEF-0000-0000-0000-000000000457 abc 1111
DEADBEEF-0000-0000-0000-0000000008AE def 2222
DEADBEEF-0000-0000-0000-0000FFFFFFEF ghi -17
(По разным причинам мы должны предоставить первые четыре байта в порядке, отличном от того, который используется по умолчанию при отображении uniqueidentifier
в виде строки, поэтому, если мы хотим отобразить DEADBEEF
, мы должны были начать наш двоичный файл как efbeadde
)
Также, конечно, вставьте обычные предупреждения о том, что если вы создаете guids / uniqueidentifiers, но не используете один из предписанных методов их генерации, то вы не можете принять какие-либо обычные гарантии уникальности.