SQL Server: преобразование UniqueIdentifier в строку в операторе case

136

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

Произошла внутренняя ошибка. Свяжитесь с нами и сообщите код ссылки xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

где xxx и т. д. - это столбец guid в таблице. Я пишу хранимую процедуру так:

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 в строку, но он многострочный, и я не думаю, что он будет работать в операторе case. Любые идеи?

aarona
источник

Ответы:

257

Я думаю, что нашел ответ:

convert(nvarchar(50), RequestID)

Вот ссылка, по которой я нашел эту информацию:

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

aarona
источник
21
В качестве альтернативы
приведите
3
В чем основное различие между cast () и convert ()?
РК Шарма
5
@RKSharma - идеальный вопрос, который вы можете задать на stackoverflow.com или поищите на этом сайте, чтобы узнать, ответил ли кто-нибудь на него.
Аарона
1
Не знаю, почему я выберу nvarchar, тем более что nvarchar(50). Уникальный идентификатор, преобразованный в текстовое значение, обрабатывается в шестнадцатеричном тире-36.
user2864740
9
Как говорят другие ответы, вы можете это сжать cast(RequestID as char(36)).
Фрэнк Тан
90

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

convert(nvarchar(36), requestID) as requestID
Филипп Грондиер
источник
2
поскольку длина фиксирована, здесь достаточно varchar (36)
gdbdable
11
Вы говорите «фиксированный» и все же «варчар» в одном предложении ... как насчет char(36)? Вы также можете использовать nchar(36), но поскольку GUID не содержит Unicode, он вам ничего не дает. И наоборот, операции с charобычно быстрее, чем varchar.
r2evans
47

На мой взгляд, uniqueidentifier/ GUID - это не a varcharи a, nvarcharа char(36). Поэтому я использую:

CAST(xyz AS char(36))
Сильван Хофер
источник
8

Вместо того Str(RequestID), чтобы попробоватьconvert(varchar(38), RequestID)

AussieAtHeart
источник