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)
[其他解释]
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')。
下面提出的问题扯远了。
[其他解释]
谢谢回复。 这个办法我试过,REPLACE中的字符串是变量,可能存在多个(由用户在界面中多选部门生成),所以这种方法不适用。只能在 IN 前面的fchrDepartmentID上下功夫了。
[其他解释]
in多个,前台sql拼成 in ('...', '...'),后台处理要动态exec的。
[其他解释]
select cast(@j as varchar(40)) 这样是可以。 比如一个GUID 为A , CAST后, A != 'A',返回结果为空,这才是麻烦的地方。
[其他解释]
那你可以把数据库中的uniqueidentifier?转换为位字符串类型,也可以插进去uniqueidentifier类型数据
这样就不用转换来转换去的了
[其他解释]
谢谢大家的回复。感觉是REPLACE函数的问题。我做了如下测试:
把GUID拿出来,手工转成字符串,插入到temp表中,原来为uniqueidentifier型的列的数据类型改为了VARCHAR(50),然后做如下查询:
select id from temp where id IN (REPLACE(REPLACE(REPLACE('( ''{16423A9C-3CC5-40CE-8EDF-5D95B66B1F77'')','''''''',''''''),'{',''),'}',''))
查询结果如下:
查询结果仍然为空!去掉REPLACE函数,IN后面跟常量字符串,就可以检索出结果了。查询结果如下:
这实在很奇怪。
[其他解释]
where id like (REPLACE(REPLACE(REPLACE('( ''{16423A9C-3CC5-40CE-8EDF-5D95B66B1F77'')','''''''',''''''),'{',''),'}','')) + '%'