10

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

我怎样才能做到这一点?SQL 服务器只是说它不能从字符串转换为唯一标识符。

4

4 回答 4

18

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

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 格式(没有 {})。

于 2009-08-10T18:23:47.247 回答
6

将 uniqueidentifier 转换为 varchar:

CAST( uniqueidentifier_col_name as varchar)
于 2009-08-10T18:20:44.397 回答
5

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

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 个十六进制数字
于 2009-08-10T18:29:23.910 回答
1

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

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

于 2009-08-10T18:22:25.237 回答