Вот способ, который использует временную таблицу для обеспечения уникальности.
Создайте и заполните # временную таблицу уникальными случайными 8-символьными кодами.
Приведенный ниже SQL использует трюк FOR XML
для генерации кодов в BASE62: [A-Za-z0-9]
Examples : 8Phs7ZYl, ugCKtPqT, U9soG39q
В GUID используются только символы [0-9A-F]
.
Для 8 символовэто может генерировать 16 ^ 8 = 4294967296 комбинаций.
В то время как с BASE62 существует 62 ^ 8 = 2.183401056e014 комбинаций.
Таким образом, шансы на создание дубликата значительно ниже с BASE62.
временная таблица должна иметь большее количество записей, чем таблица назначения.
В этом примере генерируется только 100000 кодов.Но вы поняли.
IF OBJECT_ID('tempdb..#tmpRandoms') IS NOT NULL DROP TABLE #tmpRandoms;
CREATE TABLE #tmpRandoms (
ID INT PRIMARY KEY IDENTITY(1,1),
[UniqueID] varchar(8),
CONSTRAINT UC_tmpRandoms_UniqueID UNIQUE ([UniqueID])
);
WITH DIGITS AS
(
select n
from (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n)
),
NUMS AS
(
select (d5.n*10000 + d4.n*1000 + d3.n*100 + d2.n * 10 + d1.n) as n
from DIGITS d1
cross join DIGITS d2
cross join DIGITS d3
cross join DIGITS d4
cross join DIGITS d5
)
INSERT INTO #tmpRandoms ([UniqueID])
SELECT DISTINCT LEFT(REPLACE(REPLACE((select CAST(NEWID() as varbinary(16)), n FOR XML PATH(''), BINARY BASE64),'+',''),'/',''), 8) AS [UniqueID]
FROM NUMS;
Затем обновите таблицу: 1020 *
WITH CTE AS
(
SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RN, [UniqueID]
FROM YourTable
)
UPDATE t
SET t.[UniqueID] = tmp.[UniqueID]
FROM CTE t
JOIN #tmpRandoms tmp ON tmp.ID = t.RN;
Тест на rextester здесь