#sql #excel
Вопрос:
Мне нужно создать список из 1000 уникальных случайных 6-символьных строк, которые затем экспортируются в автоматическом процессе в Excel. Проблема в том, что Excel делает глупые выводы и интерпретирует все, что неопределенно может быть числом как таковым, например, 4587E7 становится 4,59E 10 или опускает начальный 0, если строка не содержит ни одной буквы.
Я написал этот приятный SQL-код, который отлично работает, но не учитывал, что Excel может испортить впоследствии.
declare @i int = 0
WHILE @i < @Participants
BEGIN
INSERT INTO ACCESSKEYS (UserID,InquiryID) Values (Substring(Replace(NEWID(),'-',''),4,6),@Inquiry)
set @i = @i 1
END
/*Security Loop to eliminate theoretical doubles*/
WHILE (Select Count(distinct(UserID)) from ACCESSKEYS where InquiryID = @Inquiry) < @Participants
BEGIN
DELETE ACCESSKEYS
Where ID in (Select ID
From (
Select ID, ROW_NUMBER() over (partition by UserID order by ID) as ord
From ACCESSKEYS
Where InquiryID = @Inquiry)x
Where x.ord = 2)
INSERT INTO ACCESSKEYS (UserID,InquiryID) Values (Substring(Replace(NEWID(),'-',''),4,6),@Inquiry)
END
Как я могу сделать этот Excel устойчивым? Без очевидного решения поместить статический «X» перед строкой, что я и сделаю, я не могу найти более разумного решения.
В итоге я пришел к следующему:
CHAR(Cast(RAND()*(91-65) 65 as int)) Substring(Replace(NEWID(),'-',''),4,5)
Я помещаю случайную букву перед частью, поступающей из GUID, используя функцию CHAR, которая возвращает заглавные буквы для диапазона от 65 до 90
Комментарии:
1. Рассмотрите возможность настройки процесса, выполняющего экспорт (или импорт). Если строка введена как формула (
="1e4"
) или ячейка явно отформатирована как текст перед вставкой чего-либо, Excel оставит ее в покое. Также обратите внимание, чтоNEWID()
выполняемые здесь манипуляции не дадут очень хорошего распределения случайности для случаев, когда это имеет значение, поскольку строковое представление этого содержит только шестнадцатеричные цифры (поэтому только от A до F для букв).2. Добавление префикса к значению с помощью a
'
должно сделать трюк3. Вот небольшая вещь, которую я придумал, которая генерирует идентификаторы немного более эффективно и делает Excel безопасным (r), исключая
0
иe
(по-прежнему нет логики для проверки того, что идентификаторы только для чисел не генерируются, но вы могли бы просто полностью их исключить). Недостаточно отшлифовано для ответа.4.
distinct
это не функция, это заданный квантификатор . Пропустите эти лишние круглые скобки и просто напишитеCount(distinct UserID)
, чтобы сделать код более понятным.5. @JeroenMostert: На самом деле я не экспортирую, а динамически создаю файл xls на C #, используя содержимое из asp: Gridview. Не знаю, где я мог бы улучшить эту проблему, связанную с Excel на 100%. Спасибо за комментарий об относительно низкой случайности, но я могу смириться с результатом или расширить до 8 символьных ключей