【问题标题】:From varchar(36) to UNIQUEIDENTIFIER从 varchar(36) 到 UNIQUEIDENTIFIER
【发布时间】:2010-04-23 12:42:36
【问题描述】:

我正在尝试将 UNIQUEIDENTIFIER 的 AuctionId 转换为 varchar(36),然后再转换回 UNIQUEIDENTIFIER。请帮帮我。

CAST((SUBSTRING(CAST([AuctionId] as VARCHAR(36)), 0, 35) + '1') AS UNIQUEIDENTIFIER)

但我不断收到此错误:

消息 8169,第 16 级,状态 2,第 647 行 从转换时转换失败 一个字符串 唯一标识符。

提前致谢

【问题讨论】:

  • BTW - 更改 UUID 表示中的任意数字不会产生可以安全使用的值。如果您尝试创建新的 UUID,请使用 @RobinDay 提到的 NEWID()

标签: sql sql-server casting uniqueidentifier varchar


【解决方案1】:

“1”不是问题。您显然是在尝试将 GUID 的最后一个字符更改为 1。我不知道为什么,但这是您的要求。

您的问题与子字符串有关。在 TSQL 中,子字符串使用从 1 not 0 开始的索引,就像在 C 或 C# 中一样。这意味着您的子字符串语句实际上返回了 34 个字符的字符串(+1 个字符使 35,并且您被告知 35 个字符的字符串不是 GUID,这是正确的)。

只需将,0,35 更改为1,35

【讨论】:

    【解决方案2】:

    您的错误是由于您的 +'1' 和您的 SUBSTRING。你把它放在那里有什么用?

    这样就可以了

    SELECT cast((cast(NEWID() as varchar(36))) as UNIQUEIDENTIFIER)
    

    编辑:好的,所以如果你想用 '1' 替换最后一个字符,那么这就是解决方案

    SELECT CAST(SUBSTRING(CAST(NEWID() AS VARCHAR(36)), 1, 35) + '1' AS UNIQUEIDENTIFIER)
    

    唯一的区别是 SQL 中的 SUBSTRING 从位置 1 开始,而不是您之前的位置 0。

    附:这是危险的代码。输出不再是 GUID,因为它不符合用于生成 GUID 的算法。这可能(尽管不太可能)导致与 GUID 发生冲突,从而可能导致各种问题。

    【讨论】:

    • 他想用“1”替换 GUID 十六进制表示的最后一位?不知道为什么...
    【解决方案3】:

    正如其他人所观察到的那样,不清楚你为什么要做你正在做的事情。

    SUBSTRING 的替代方法是STUFF 命令:

    SELECT stuff(cast([AuctionId] as varchar(36)),36,1,'1')

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 2010-11-26
      • 2010-10-15
      • 2011-02-09
      • 2019-09-02
      相关资源
      最近更新 更多