日期:2014-05-17  浏览次数:20470 次

GUID和字符串比较的问题,高手进!!
我把这个问题做了简化:
1.先看一段代码
   select fchrdepartmentid from vw_U8DRP_StockReturnList where fchrDepartmentID in 
 (  ('EA6B0395-7C2A-458F-91B1-3430DB937050') ) 
   能正常查出数据。其中,fchrDepartmentID 为GUID型。

2.把1中的红色部分换成一个函数(实际上在第1步中我是把函数查出的结果用来测试的),如下所示:
select fchrdepartmentid from vw_U8DRP_StockReturnList where fchrDepartmentID in 
 (  REPLACE(REPLACE(REPLACE('( ''{EA6B0395-7C2A-458F-91B1-3430DB937050}'')','''''''',''''''),'{',''),'}','')   )
 其中,红色部分的结果就是第1步中的红色部分。这段代码查询报错,错误信息:
        将字符串转换为 uniqueidentifier 时失败。

3. 考虑到可能是字符串的问题,我在第3步中对fchrDepartmentID 做了转化,代码如下:
select fchrdepartmentid from vw_U8DRP_StockReturnList where CAST(fchrDepartmentID as nvarchar(50)) in (REPLACE(REPLACE(REPLACE('( ''{EA6B0395-7C2A-458F-91B1-3430DB937050}'')','''''''',''''''),'{',''),'}',''))
  令人诧异的是,本次查询结果为空!

问题:
 1)GUID和字符串应该如何转化、比较?
 2)SQL字符串比较中NVARCHAR 和VARCHAR是否有区别? (我认为没区别)
------最佳解决方案--------------------

declare @i uniqueidentifier 
set @i=newid()
select @i+'1' --这样会报错的。

declare @j uniqueidentifier 
set @j=newid()
select ltrim(@j)+'1' --这样是可以的。

select cast(@j as varchar(40))+'1' --这样是可以的。

select convert(varchar(40),@j)+'1' --这样也是可以的。

------其他解决方案--------------------
declare @sql varchar(8000)
set @sql = 'select fchrdepartmentid from vw_U8DRP_StockReturnList where fchrDepartmentID in ('+  REPLACE(REPLACE(REPLACE('( ''{EA6B0395-7C2A-458F-91B1-3430DB937050}'')','''''''',''''''),'{',''),'}','')   +')'
exec(@sql)

------其他解决方案--------------------
引用:
引用:SQL code



123456789101112

declare @i uniqueidentifier  set @i=newid() select @i+'1' --这样会报错的。   declare @j uniqueidentifier  set @j=newid() select ltrim(@j)+……



declare @j uniqueidentifier 
set @j='8880E33B-DE1F-4A1A-AF0C-84611A173E80'

if(convert(varchar(40),@j)='8880E33B-DE1F-4A1A-AF0C-84611A173E80')
select '相等'

--是相等的呀

------其他解决方案--------------------
2、一堆REPLACE后的结果是 ( 'EA6B0395-7C2A-458F-91B1-3430DB937050'),转换为 uniqueidentifier 时失败。

select fchrdepartmentid from vw_U8DRP_StockReturnList where fchrDepartmentID in 
( substring('( ''{EA6B0395-7C2A-458F-91B1-3430DB937050}'')', charindex('{','( ''{EA6B0395-7C2A-458F-91B1-3430DB937050}'')')+1, 36) )

3、同上,没有任何GUID字符串形式会等于( 'EA6B0395-7C2A-458F-91B1-3430DB937050')。

下面提出的问题扯远了。

------其他解决方案--------------------
引用:
2、一堆REPLACE后的结果是 ( 'EA6B0395-7C2A-458F-91B1-3430DB937050'),转换为 uniqueidentifier 时失败。

select fchrdepartmentid from vw_U8DRP_StockReturnList where fchrDepartmentID in