Создайте 1000 случайных 6-символьных строк, которые не будут интерпретироваться как число при импорте в Excel

#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 символьных ключей