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

aar*_*ona 121 sql-server guid case

我们有一个日志表,其中有一个消息列,有时会有一个异常堆栈跟踪.我有一些标准来确定消息是否具有此功能.我们不希望向客户显示这些消息,而是发出如下消息:

内部错误发生.请与我们联系,参考代码为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
Run Code Online (Sandbox Code Playgroud)

RequestID是SQL Server中的Guid数据类型,在此处不转换为字符串.我已经看到了一些关于如何将Guid转换为字符串的代码,但它是多行的,我不认为它会在case语句中起作用.有任何想法吗?

aar*_*ona 238

我想我找到了答案:

convert(nvarchar(50), RequestID)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 或者,强制转换(RequestID as varchar(50)) (19认同)
  • 正如其他答案所说,你可以压缩这个`cast(RequestID as char(36))`. (8认同)
  • @RKSharma这是一个完美的问题,你可以在stackoverflow.com上询问或搜索这个网站,看看是否有人已经回复了它. (5认同)
  • cast()和convert()之间的基本区别是什么? (2认同)
  • 我不知道为什么我会选择 `nvarchar`,更不用说 `nvarchar(50)`。唯一标识符在转换为文本值时在 hex-dash-36 中处理。 (2认同)

Phi*_*ier 82

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

convert(nvarchar(36), requestID) as requestID
Run Code Online (Sandbox Code Playgroud)

  • 你在同一句话中说"固定"而且"varchar"......怎么样`char(36)`?你也可以使用`nchar(36)`,但由于GUID不包含unicode,它什么都不买.相反,使用`char`的操作通常比`varchar`更快. (11认同)
  • 因为长度是固定的,即使在这里varchar(36)也足够 (2认同)

Sil*_*fer 31

在我看来,uniqueidentifier/ GUID既不是a varchar也不是nvarchara char(36).因此我使用:

CAST(xyz AS char(36))
Run Code Online (Sandbox Code Playgroud)


小智 8

而不是Str(RequestID),尝试convert(varchar(38), RequestID)