Этот вопрос старый, но я пытался сделать то же самое. Это то, что я придумал на SQL Server 2012.
Create Function NewObjectId(@counter binary(3))
returns binary(12)
begin
declare @epoch datetime2, @seconds binary(4), @process binary(2), @hostname binary(3)
set @epoch = '1/1/1970'
select @seconds = cast(Datediff(ss, @epoch, getutcdate()) as binary(4))
select @hostname = cast(HashBytes('MD5', HOST_NAME()) as binary(3))
select @process = cast(@@SPID as binary(2))
declare @objectId binary(12)
select @objectId = (@seconds + @hostname + @process + @counter)
return @objectId
end
Это можно назвать так:
select NewObjectId(CRYPT_GEN_RANDOM(3))
Причина, по которой передается CRYPT_GEN_RANDOM (3), заключается в том, что вызов этой функции, по-видимому, имеет побочные эффекты и не может использоваться внутри другой функции. Я бы предпочел использовать инкрементную последовательность для части счетчика, но случайное число также работает.
Также я заметил, что вы сказали, что используете char (24) для хранения значения. Это возвращает двоичный код (12), поскольку это то, что и есть ObjectIds MongoDB. Использование двоичного кода (12) также требует половины пространства для хранения значения.
Я уверен, что сейчас это бесполезно, но решить проблему было весело.
Я попытаюсь взять мой код ObjectID C # и посмотреть, смогу ли я загрузить его как функцию CLR в SQL Server. Это может дать лучшие результаты и производительность.