SQL Server: перетворення UniqueIdentifier в рядок у випадок справи


136

У нас є таблиця журналів, що містить стовпчик повідомлень, який іноді має трасування стека виключень. У мене є деякі критерії, які визначають, чи має повідомлення таке. Ми не хочемо показувати ці повідомлення клієнту, але натомість маємо повідомлення типу:

Виникла внутрішня помилка. Зверніться до США з посилальним кодом xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

де xxx тощо - стовпчик орієнтирів у таблиці. Я пишу збережений прок так:

declare @exceptionCriteria nvarchar(50)
select @exceptionCriteria = '%<enter criteria etc>%'

select LogDate,
       case
       when Message like @exceptionCriteria
       then 'Internal Error Occured. Reference Code: ' + str(RequestID)
       else Message
       end
  from UpdateQueue

RequestIDє типом даних Guid в SQL Server і тут не перетворюється на рядок. Я бачив якийсь код про те, як перетворити Guid у рядок, але він є багаторівневим, і я не думаю, що він би працював у заяві справи. Будь-які ідеї?

Відповіді:


257

Я думаю, що знайшов відповідь:

convert(nvarchar(50), RequestID)

Ось посилання, де я знайшов цю інформацію:

http://msdn.microsoft.com/en-us/library/ms187928.aspx


21
Як варіант, акторський склад (RequestID як varchar (50))
MK_Dev

3
Яка основна відмінність між cast () та convert ()?
RK Sharma

5
@RKSharma - це ідеальне запитання, яке ви можете задати на сайті stackoverflow.com або шукати на цьому веб-сайті, щоб побачити, чи хтось уже відповів на нього.
aarona

1
Я не знаю, чому я вибираю nvarchar, тим більше nvarchar(50). Унікальний ідентифікатор при перетворенні в текстове значення обробляється в hex-dash-36.
користувач2864740

9
Як говорять інші відповіді, ви можете це ущільнити cast(RequestID as char(36)).
Франк Тан

90

Тут можна використовувати функцію перетворення, але 36 символів достатньо для утримання унікального значення ідентифікатора:

convert(nvarchar(36), requestID) as requestID

2
тому що довжина фіксована, навіть варчара (36) тут достатньо
gdbdable

11
Ви кажете "фіксований" і все-таки "варчар" у тому ж реченні ... а як char(36)? Ви також можете використовувати nchar(36), але оскільки GUID не містить unicode, він нічого не купує. І навпаки, операції з, charяк правило, швидше, ніж varchar.
r2evans

47

На мою думку, uniqueidentifier/ GUID не є ні varcharані, nvarcharа є char(36). Тому я використовую:

CAST(xyz AS char(36))

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.