sql-server – 针对SQL Server数据库的Oracle查询,给出不一致的结果

我们有多个Oracle 11.2.0.2数据库,其中包含指向SQL Server 2008数据库的og4odbc数据库链接. SQL Server数据库中的特定表有两个Varchar(36)列.以下语句返回1292行:

select "id", "folder_id" from dbo.mediasite_presentation@ms;

查询第一列中的特定值将返回一行:

select "id", "folder_id" from dbo.mediasite_presentation@ms 
   where "id"='006d815d-6e9e-4004-9104-51213a1ecd52';
id                                   folder_id
------------------------------------ ------------------------------------
006d815d-6e9e-4004-9104-51213a1ecd52 54aa9b6e-1c55-4de5-a06f-033d8b19fff0

但是在第二列中查询特定值不会返回任何行:

select "id", "folder_id" from dbo.mediasite_presentation@ms 
   where "folder_id"='54aa9b6e-1c55-4de5-a06f-033d8b19fff0';
no rows selected

使用where子句工作并将每个字段包装在to_char中会返回以下有趣结果:

select to_char("id"), to_char("folder_id") from dbo.mediasite_presentation@ms 
   where "id"='006d815d-6e9e-4004-9104-51213a1ecd52';
TO_CHAR("ID")                        TO_CHAR("FOLDER_ID")
------------------------------------ ------------------------------------
006d815d-6e9e-4004-9104-51213a1ecd52 ┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐

有趣的是,我只需添加一个rownum子句就可以产生相同的结果:

select "id", "folder_id" from dbo.mediasite_presentation@ms 
   where "id"='006d815d-6e9e-4004-9104-51213a1ecd52' and rownum<=1;

id                                   folder_id
------------------------------------ ------------------
006d815d-6e9e-4004-9104-51213a1ecd52 ┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐

更奇怪的是,为查询创建实体化视图而不返回任何数据实际上返回数据.

Create Materialized View TempMV as (
   select "id", "folder_id" from dbo.mediasite_presentation@ms 
      where "folder_id"='54aa9b6e-1c55-4de5-a06f-033d8b19fff0' and rownum<=1);
Materialized view created.
select * from TempMV;

id                                   folder_id
------------------------------------ ------------------------------------
006d815d-6e9e-4004-9104-51213a1ecd52 54aa9b6e-1c55-4de5-a06f-033d8b19fff0

即使你只能解释一个这个难题,请回答.

最佳答案
我怀疑有些字符转换问题.
当您执行TO_CHAR时,您将返回“┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐┐”(18个字符).这表明列中包含的数据是单字节还是多字节存在一些混淆.

“SQL Server中的uniqueidentifier数据类型本身存储为16字节的二进制值”
理想情况下,这应该作为RAW数据类型而不是VARCHAR2或CHAR.

如果你做了

CREATE VIEW temp_view as select  "id", "folder_id" from dbo.mediasite_presentation@ms

当您执行DESC temp_view时会显示什么

转载注明原文:sql-server – 针对SQL Server数据库的Oracle查询,给出不一致的结果 - 代码日志