2009-08-10 44 views
8

由於我當前的項目一個相當輝煌的監督,我們有一些的GUID獲得存儲在VARCHAR列在一個表中,這需要比較到另一個uniqueidentifier列。比較VARCHAR和唯一標識符

我該怎麼做? SQL服務器只是說它不能從字符串轉換爲唯一標識符。

回答

15

如果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; 

視您actualy存儲的唯一標識符,你將極有可能tomodify數據和代碼相匹配的SQL格式(無{}) 。

5

轉換的唯一標識符爲varchar:

CAST(uniqueidentifier_col_name as varchar) 
+0

不能轉換爲一個單一的VARCHAR但VARCHAR(50)即 – 2017-06-30 18:48:06

1

你必須在其他唯一標識符轉換爲VARCHAR。

SQL Server可能試圖將諸如「bob」之類的東西投射到uniqueidentifier並且失敗。 根據CAST/CONVERT它是允許的,所以它必須是varchar列中的值。

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進制數字