SQL Server:在case语句中将UniqueIdentifier转换为字符串


136

我们有一个日志表,该表的消息列有时具有异常堆栈跟踪。我有一些确定邮件是否包含此条件的条件。我们不想向客户显示这些消息,而是显示类似以下消息:

发生内部错误。请使用参考代码xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx与我们联系

其中xxx etc是表中的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是SQL Server中的Guid数据类型,此处不会转换为字符串。我已经看到了一些有关如何将Guid转换为字符串的代码,但是它是多行的,我认为它在case语句中不起作用。有任何想法吗?

Answers:


257

我想我找到了答案:

convert(nvarchar(50), RequestID)

这是我找到此信息的链接:

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


21
另外,cast(RequestID as varchar(50))
MK_Dev 2011年

3
cast()和convert()之间的基本区别是什么?
RK Sharma 2015年

5
@RKSharma是一个完美的问题,您可以在stackoverflow.com上提问,或者搜索此站点以查看是否有人已经回答了。
aarona 2015年

1
我不知道为什么选择nvarchar,更不用说了nvarchar(50)。转换为文本值时的唯一标识符将在hex-dash-36中处理。
user2864740 '16

9
就像其他答案所说的那样,您可以压缩一下cast(RequestID as char(36))
坦率的谭

90

可以在此处使用转换功能,但是36个字符足以容纳唯一的标识符值:

convert(nvarchar(36), requestID) as requestID

2
因为长度是固定的,即使varchar(36)在这里也足够
gdbdable

11
您在同一句话中说了“固定”而又是“ varchar”……怎么样char(36)?您可能还会使用nchar(36),但是由于GUID不包含unicode,因此它不会给您带来任何好处。相反,使用的操作char通常比快varchar
r2evans


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.