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

Posted

技术标签:

【中文标题】SQL Server:在 case 语句中将 UniqueIdentifier 转换为字符串【英文标题】:SQL Server: converting UniqueIdentifier to string in a case statement 【发布时间】:2011-09-12 02:19:50 【问题描述】:

我们有一个日志表,其中有一个消息列,该列有时具有异常堆栈跟踪。我有一些标准可以确定消息是否包含此内容。我们不想向客户显示这些消息,而是有如下消息:

发生内部错误。联系我们 带参考代码 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 语句中工作。有什么想法吗?

【问题讨论】:

【参考方案1】:

我想我找到了答案:

convert(nvarchar(50), RequestID)

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

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

【讨论】:

或者,cast(RequestID as varchar(50)) cast() 和 convert() 的基本区别是什么? @RKSharma 这是一个完美的问题,您可以在 ***.com 上提问或搜索此站点以查看是否有人已回答。 我不知道为什么我会选择nvarchar,更不用说nvarchar(50)。唯一标识符,当转换为文本值时,会在 hex-dash-36 中处理。 正如其他答案所说,你可以压缩这个cast(RequestID as char(36))【参考方案2】:

这里可以使用转换函数,但是36个字符就足够保存唯一标识符值了:

convert(nvarchar(36), requestID) as requestID

编辑:是的,如 cmets、char 或 nchar 中所述,或者任何可以正确操作 ASCII 字符表的函数都可以解决问题。然后,我的借口是我通常在多语言/多字母环境中工作,并且规则是始终使用 nvarchar。这是我做事的明智之举,对不起。而且,如果有一天,某些数据库软件开始生成具有非 ASCII 元素的唯一标识符,我会做好准备的。

【讨论】:

因为长度是固定的,即使这里 varchar(36) 也足够了 你在同一个句子中说“固定”和“varchar”......char(36)怎么样?您也可以使用nchar(36),但由于 GUID 不包含 unicode,它不会给您带来任何好处。相反,使用char 的操作通常比varchar 快。 我们不应该是大写的CONVERT【参考方案3】:

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

【讨论】:

【参考方案4】:

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

CAST(xyz AS char(36))

【讨论】:

以上是关于SQL Server:在 case 语句中将 UniqueIdentifier 转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery 中将两个查询与 case 语句相结合

SQL Server 2008 使用 case 语句查看错误

SQL Server IIF 与 CASE

SQL Server:CASE 语句中的 OR 语句

在 SQL Server 中执行嵌套 case 语句逻辑的最佳方法

SQL Server CASE .. WHEN .. IN 语句