比较Varchar和UniqueIdentifier

时间:2009-08-10 18:15:31

标签: sql-server uniqueidentifier

由于我当前项目中的监督非常出色,我们将一些guid存储在一个表中的varchar列中,需要将其与另一个表中的uniqueidentifier列进行比较。

我该怎么做? SQL服务器只是说它无法从字符串转换为uniqueidentifier。

4 个答案:

答案 0 :(得分: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;

根据您实际存储uniqueidentifier的方式,您很可能会对数据和代码进行修改以匹配SQL格式(no {})。

答案 1 :(得分:5)

将uniqueidentifier转换为varchar:

CAST( uniqueidentifier_col_name as varchar)

答案 2 :(得分:4)

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

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个十六进制数字

答案 3 :(得分:1)

您必须将另一个uniqueidentifier强制转换为varchar。

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