создать в SQL кодированную строку base64 - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь создать сценарий SQL для создания пользователя-администратора для моего веб-приложения, но я столкнулся с небольшим скачком скорости.

Вы видите, что я использую Microsoft.AspNet.Identity, который создает идентификаторы для пользователейэто кодированные строки 64base (я думаю) EG: h231hj4f-bae1-nfwe-m24n-k954bd8s0l1r

, но каждая строка, которую я создаю, даже не выглядит удаленно, и выдает ошибку, когда я пытаюсь войти, говоря

Недопустимая длина для массива символов Base-64.

Это то, что у меня есть:

DECLARE @RandomLength2 int;
/*Generate random number between 42 and 38*/
SET @RandomLength2 = (SELECT ROUND(((42-38-1) * RAND() + 38), 0));

DECLARE @generatedId2 nvarchar(42);
/*Generate string of 42 chars*/
SET @generatedId2 = (
SELECT
c1 AS [text()]
FROM
(
SELECT TOP (@RandomLength2) c1
FROM
  (
VALUES
  ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'),
  ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'),
  ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z'), ('0'), ('1'), ('2'), ('3'),
  ('4'), ('5'), ('6'), ('7'), ('8'), ('9')  
  ) AS T1(c1)
ORDER BY ABS(CHECKSUM(NEWID()))
) AS T2
FOR XML PATH('')
);

DECLARE @base64GeneratedSecurityStamp nvarchar(max)
/*generate base64 char string with the generatedString*/
SET @base64GeneratedSecurityStamp = (SELECT LOWER(
CAST(N'' AS XML).value(
      'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
    , 'VARCHAR(MAX)'
))
FROM (
SELECT CAST(@generatedId2 AS VARBINARY(MAX)) AS bin
) AS bin_sql_server_temp);

SELECT @base64GeneratedSecurityStamp;

, который генерирует что-то вроде uqbuaeeawaaxadyasabqaemarqazaekawqbeaeoanabwadcargbvae4amabmaesatwbcaduavwbhae0awga5afiauwa4adia


РЕДАКТИРОВАТЬ

Я внес некоторые коррективы, теперь я создаю случайную строку из 32 символов вместо случайно сгенерированных и использую подстроки для разделения строки на части, используя '-'

генерирует строки вроде: vxnlckdl-ynj1-wtlc-5hyw-= или qgbuafma-sgbo-e8at-bzae-aoaa5aegaqqb

DECLARE @RandomLength2 int;

SET @RandomLength2 = (SELECT ROUND(((42-38-1) * RAND() + 38), 0));

DECLARE @generatedId2 nvarchar(32);

SET @generatedId2 = (
SELECT
c1 AS [text()]
FROM
(
SELECT TOP (32) c1
FROM
  (
VALUES
  ('A'), ('B'), ('C'), ('D'), ('E'), ('F'), ('G'), ('H'), ('I'), ('J'),
  ('K'), ('L'), ('M'), ('N'), ('O'), ('P'), ('Q'), ('R'), ('S'), ('T'),
  ('U'), ('V'), ('W'), ('X'), ('Y'), ('Z'), ('0'), ('1'), ('2'), ('3'),
  ('4'), ('5'), ('6'), ('7'), ('8'), ('9')  
  ) AS T1(c1)
ORDER BY ABS(CHECKSUM(NEWID()))
) AS T2
FOR XML PATH('')
);

DECLARE @base64GeneratedSecurityStamp nvarchar(max)

SET @base64GeneratedSecurityStamp = (SELECT LOWER(
CAST(N'' AS XML).value(
      'xs:base64Binary(xs:hexBinary(sql:column("bin")))'
    , 'VARCHAR(MAX)'
))
FROM (
SELECT CAST(@generatedId2 AS VARBINARY(MAX)) AS bin
) AS bin_sql_server_temp);

SET @base64GeneratedSecurityStamp = ((SUBSTRING(@base64GeneratedSecurityStamp, 1, 8) +'-'+ SUBSTRING(@base64GeneratedSecurityStamp, 9, 4) +'-'+ SUBSTRING(@base64GeneratedSecurityStamp, 14, 4) +'-'+ SUBSTRING(@base64GeneratedSecurityStamp, 19, 4) +'-'+ SUBSTRING(@base64GeneratedSecurityStamp, 24, 12)));

SELECT @base64GeneratedSecurityStamp;
...