GUID和字符串比较的问题,高手进!!我把这个问题做了简化:1.先看一段代码select fchrdepartmentid from vw_U
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}'')','''''''',''''''),'{',''),'}','')) 令人诧异的是,本次查询结果为空!
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'
select fchrdepartmentid from vw_U8DRP_StockReturnList where fchrDepartmentID in ( substring('( ''{EA6B0395-7C2A-458F-91B1-3430DB937050}'')', charindex('{','( ''{EA6B0395-7C2A-458F-91B1-3430DB937050}'')')+1, 36) )
谢谢回复。 这个办法我试过,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'')','''''''',''''''),'{',''),'}','')) + '%'