使用count(*)对抗sqlite的openquery的sql server

时间:2017-03-15 22:42:57

标签: sqlite sql-server-2012 openquery

我在sql server中通过链接服务器连接了sqlite数据库。 以下查询工作正常:

select *
from openquery(
    eod, 
    'select id, min(dt) as mindt, max(dt) as maxdt from [tdata] group by id'
)

但是此查询返回错误:

select *
from openquery(
    eod,
   'select COUNT(*) as cnt from [tdata]'
)

错误是:

  

链接服务器“eod”的OLE DB提供程序“MSDASQL”为列提供了不一致的元数据。对象“从[tdata]中选择COUNT(*)作为cnt”的列“cnt”(编译时序号1)报告在编译时具有129的“DBTYPE”,在运行时具有3个。

可能有什么问题以及如何解决?

1 个答案:

答案 0 :(得分:4)

错误消息中的数据类型提供了解决问题的线索。来自Microsoft doc

DBTYPE_I4 = 3, A four-byte, signed integer: LONG
DBTYPE_STR = 129, A null-terminated ANSI/DBCS character string

无论出于何种原因,在编译时,假定查询返回一个字符串。

尝试按照预期返回一个字符串(符合quirk通常是解决方案的最快路径):

select cast(COUNT(*) as varchar(20)) as cnt from [tdata]

或尝试显式返回类型,如果框架无法处理64位整数,则选择32位整数:

select cast(COUNT(*) as int) as cnt from [tdata]

微软的另一个例子是“不工作”。