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

206

我们有一张日志表,其中有一个消息列,有时会包含异常堆栈追踪信息。我有一些条件来确定消息是否具有此内容。我们不希望向客户显示这些消息,而是显示以下消息:

发生内部错误。请联系我们,并提供参考代码 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是在SQL Server中的Guid数据类型,在此处无法转换为字符串。我看过一些代码,可以将Guid转换为字符串,但它有多行且我不认为它适用于case语句。有任何想法吗?

4个回答

376

24
将RequestID转换为varchar(50)格式,或者说将其作为varchar(50)类型进行转换。 - MK_Dev
4
cast() 和 convert() 的基本区别是什么? - R K Sharma
5
我不知道为什么会选择 nvarchar,更别提 nvarchar(50)了。当将唯一标识符转换为文本值时,它被视为十六进制短划线36。 - user2864740
我在我的视图中使用它,效果很好,并将其发送给我在 SQL 社区的朋友。GUID 看起来让我感到困惑 ;) - saber tabatabaee yazdi
19
如其他答案所说,您可以将cast(RequestID as char(36))简化。 - Frank Tan
显示剩余2条评论

113

虽然可以在这里使用convert函数,但36个字符足以存储唯一标识值:

convert(nvarchar(36), requestID) as requestID

编辑:是的,如评论中所述,char、nchar或任何可以正确操作ASCII字符表的函数都可以解决问题。那么,我的借口是我通常在多语言/多字母表环境中工作,并且规则是始终选择nvarchar。这是我做事情的简单方式,抱歉。而且,如果有一天,某些数据库软件开始生成带有非ASCII元素的唯一标识符,我会做好准备。


2
因为长度是固定的,即使使用varchar(36),在这里也足够了。 - gdbdable
14
您说“固定”和“varchar”在同一个句子中...那么如何使用char(36)?您也可以使用nchar(36),但由于GUID不包含Unicode,所以这样做并没有什么意义。相反,使用char的操作通常比使用varchar更快。 - r2evans
我们不应该把CONVERT转换为大写吗? - P6345uk

72

在我看来,uniqueidentifier / GUID 既不是 varchar 也不是 nvarchar,而是一个 char(36)。因此我使用:

CAST(xyz AS char(36))

9

尝试使用convert(varchar(38), RequestID)代替Str(RequestID)


你是不是指 varchar(36)?当我们处理 GUID 时,为什么会多出两个字符? - Jeremy Caney
1
@JeremyCaney 我编辑了我的回答,展示了一个更好的解决方案。虽然这是很久以前的事情了,但我认为数据库中的列长度为50个字符,因此我选择了那个值。 - aarona

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接