比较Varchar和UniqueIdentifier

11
由于我当前项目中的一些疏忽,在一个表中将一些GUID存储在VARCHAR列中,需要与另一个表中的UNIQUEIDENTIFIER列进行比较。如何才能实现这一点?SQL Server只提示无法从字符字符串转换为Uniqueidentifier。
4个回答

20

如果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格式(无{})。


6

将唯一标识符转换为 varchar:

CAST( uniqueidentifier_col_name as varchar)

3
不能将其转换为单个 varchar,但可以转换为 varchar(50)。 - Martin.Martinsson

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

1

你需要将另一个唯一标识符转换为 varchar。

SQL Server 可能会尝试将像 "bob" 这样的内容转换为唯一标识符,但失败了。 根据 CAST/CONVERT,这是允许的,所以问题可能出在 varchar 列中的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接