【问题标题】:Compare Varchar and UniqueIdentifier比较 Varchar 和 UniqueIdentifier
【发布时间】:2009-08-10 18:15:30
【问题描述】:

由于我当前项目中的一个相当出色的疏忽,我们有一些 guid 存储在一个表的 varchar 列中,需要与另一个表中的 uniqueidentifier 列进行比较。

我该怎么做? SQL Server 只是说它不能从字符串转换为唯一标识符。

【问题讨论】:

    标签: sql-server uniqueidentifier


    【解决方案1】:

    如果 SQL 抱怨它无法强制转换,这意味着不仅您将 uniqueidentifier 存储为 varchar,而且您使用了与 SQL Server 不同的格式(例如,您添加了“{”和“}”)。如果格式正确,SQL 完全能够将字符串转换为唯一标识符:

    declare @u uniqueidentifier;
    declare @s varchar(64);
    
    select @u = NEWID();
    select @s = CAST(@u as varchar(64));
    select CAST(@s as uniqueidentifier), @u, @s;
    

    根据您实际存储唯一标识符的方式,您很可能需要修改数据和代码以匹配 SQL 格式(无 {})。

    【讨论】:

      【解决方案2】:

      将 uniqueidentifier 转换为 varchar:

      CAST( uniqueidentifier_col_name as varchar)
      

      【讨论】:

      • 您不能转换为单个 varchar 但 varchar(50) 即
      【解决方案3】:

      我刚刚编写了以下测试脚本:

      DECLARE
        @Foo Uniqueidentifier
       ,@Foo2 varchar(50)
      
      SET @Foo = newid()
      SET @Foo2 = newId()
      
      print @Foo
      print @Foo2
      
      if @Foo = @Foo2
          print 'Yes'
      else
          print 'No'
      
      set @Foo = @Foo2
      
      if @Foo = @Foo2
          print 'Yes'
      else
          print 'No'
      

      在 SSMS 窗口或通过 slqcmd -i 文件运行,结果是相同的——SQL (2005) 进行隐式转换。这支持了我在几年前遇到类似问题时从 SQL 2000 中回忆的内容。

      关键是 varchar 字符串必须匹配 guid 模式:

      • 8 个十六进制数字
      • 破折号
      • 4 个十六进制数字
      • 破折号
      • 4 个十六进制数字
      • 破折号
      • 4 个十六进制数字
      • 破折号
      • 12 个十六进制数字

      【讨论】:

        【解决方案4】:

        您必须将另一个唯一标识符转换为 varchar。

        SQL Server 可能正在尝试将诸如“bob”之类的内容转换为 uniqueidentifier,但它失败了。 根据CAST/CONVERT 是允许的,所以它必须是varchar 列中的值。

        【讨论】:

          猜你喜欢
          • 2013-06-24
          • 1970-01-01
          • 2015-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-22
          相关资源
          最近更新 更多