Invoke-Sqlcmd изменяет регистры uniqueidentifier

Я пытаюсь разработать сценарий для регулярного экспорта правильно отформатированных файлов CSV в соответствии с RFC 4180. Для этого я использую сценарий PowerShell, который вызывает Sqlcmd. Однако выходные данные меняют регистр некоторых значений в базе данных. Например, значение uniqueidentifier меняется с полностью верхнего регистра на

92adbee2-adbf-de11-90b0-005056b325c4

Сценарий, который я запускаю для вывода на терминал powershell, приведен ниже.

Invoke-Sqlcmd -Query "SELECT top 10 * FROM 
dbo.Account;" `
-Database db_name `
-Server server-name `
-QueryTimeout 65535

Есть ли способ остановить этот инструмент, изменяющий регистр значений, которые имеют тип uniqueidentifier?

Спасибо


person JimS    schedule 22.06.2017    source источник
comment
UniquIdentifier — это не строка, это 16-байтовое шестнадцатеричное число. поэтому регистр букв не имеет значения. a и A оба равны десятичному 10 или двоичному 1010.   -  person Zohar Peled    schedule 22.06.2017
comment
@ZoharPeled, но я полагаю, что он преобразуется в строку при выводе в окно csv или PowerShell? Мой вопрос: может ли он просто экспортировать его как строку в верхнем регистре? Когда я запускаю тот же запрос sql в студии управления, значения uniqueidentifier, отображаемые в сетке результатов, отображаются в верхнем регистре, но с помощью командлета sqlcmd они возвращаются в нижнем регистре.   -  person JimS    schedule 22.06.2017
comment
Это просто строковое представление. Это не меняет значение guid.   -  person Zohar Peled    schedule 22.06.2017
comment
Строковое представление будет использоваться в нижестоящей системе, поэтому мне нужно, чтобы строковое представление guid было согласованным при экспорте и желательно в верхнем регистре.   -  person JimS    schedule 22.06.2017
comment
Если вам нужно, чтобы это было в верхнем регистре, просто назначьте его переменной и используйте команду .ToUpper().   -  person Nick    schedule 22.06.2017
comment
Проблема в том, что я просто делаю select *, чтобы вывести всю таблицу. Я бы предпочел не записывать имя каждой переменной, если я могу этого избежать. Не поленитесь..... их довольно много.   -  person JimS    schedule 23.06.2017


Ответы (2)


Поскольку в некоторых комментариях указывается, что uniqueidentifier на самом деле является двоичным значением, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx является просто одним из множества различных визуальных представлений двоичного значения.

В SQL Server Management Studio окно результатов запроса форматирует уникальные идентификаторы, используя макет xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx с шестнадцатеричными цифрами в верхнем регистре.

Тип uniqueidentifier в SQL Server сопоставляется с типом Guid в PowerShell (т. е. .Net). По умолчанию .Net Guid.ToString Метод также использует макет xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx, но с шестнадцатеричными цифрами в нижнем регистре.

Если бы вы могли переопределить метод Guid.ToString в PowerShell, вы могли бы изменить используемый формат, но вы не можете этого сделать. Если у вас уже есть собственный форматировщик таблиц для обработки особых случаев RFC 4180 (кавычки, разделители в значениях и т. д.), вы можете добавить туда форматирование Guid.

person Rhys Jones    schedule 23.05.2018

Используется в Powershell: $SQL_Command = "sqlcmd -S $DbServer -U $SQL_User -P $SQL_Pass -i $TSQL_File -o$CSV_OutPut_FileName -s ',' -w 65530"

Вызов-выражение $SQL_Command

Первая переменная ($SQL_Command) хранит команду sqlcmd. Командлет Invoke-Expression оценивает или запускает указанную строку как команду.

Переменная $TSQL_File — это имя файла, содержащее операторы sql (пример: SELECT GUID FROM TableName....uniqueidentifier data type in sql server, или вы можете использовать SELECT * FROM TableName)

Вывод не изменит случаи типа данных uniqueidentifier в SQL Server... Надеюсь, что это поможет.

Синтаксис для sqlcmd
-a размер_пакета
-A (выделенное подключение администратора)
-b (прекратить пакетное задание в случае ошибки)
-c терминатор_пакета
-C (доверять сертификату сервера )
-d имя_базы_данных
-e (эхо-ввод)
-E (использовать доверенное соединение)
-f кодовая страница | i:кодовая страница[,o:кодовая страница] | o:codepage[,i:codepage] -g (включить шифрование столбцов) -G (использовать Azure Active Directory для проверки подлинности) -h rows_per_header
-H имя_рабочей_станции
-i input_file
-I (включить идентификаторы в кавычках )
-j (Печать необработанных сообщений об ошибках) -k[1 | 2] (удалить или заменить управляющие символы)
-K application_intent
-l login_timeout
-L[c] (список серверов, необязательный чистый вывод)
-m error_level
-M multisubnet_failover< br> -N (зашифровать соединение)
-o выходной_файл
-p[1] (распечатать статистику, необязательный формат двоеточия)
-P пароль
-q "запрос командной строки"
-Q "запрос командной строки" (и выход)
-r[0 | 1] (сообщение на стандартный вывод)
-R (использовать региональные настройки клиента)
-s col_separator
-S [протокол:]сервер[имя_экземпляра][,порт]
-t query_timeout
-u (выходной файл в формате Unicode)
-U идентификатор_логина
-v var = "значение"
-V уровень_серьезности_ошибки
-w ширина_столбца
-W (удалить конечные пробелы)
-x (отключить подстановку переменных)
-X[1] (отключить команды, сценарий запуска, переменные среды, необязательный выход)
-y переменная_длина_типа_ширина_отображения
-Y фиксированная_длина_типа_ширина_отображения
-z новый_пароль
-Z новый_пароль (и выход)
-? (Применение)

person Rachan Terrell    schedule 23.05.2018
comment
Объяснение того, что вы здесь делаете, было бы полезно для других людей. - person Rhys Jones; 24.05.2018
comment
Спасибо за ваше предложение. Я торопился вчера, не успел объяснить. - person Rachan Terrell; 24.05.2018