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 转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 使用 case 语句查看错误