【问题标题】:sql server with openquery using count(*) against sqlite使用count(*)对sqlite进行openquery的sql server
【发布时间】:2017-03-15 22:42:57
【问题描述】:

我通过 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”为列提供了不一致的元数据。据报道,对象“select COUNT(*) as cnt from [tdata]”的列“cnt”(编译时序号 1)在编译时的“DBTYPE”为 129,在运行时为 3。

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

【问题讨论】:

    标签: sqlite sql-server-2012 openquery


    【解决方案1】:

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

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

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

    尝试返回预期的字符串(符合怪癖通常是解决问题的最快途径):

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

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

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

    又一个微软产品“不工作”的例子。

    【讨论】:

    • 谢谢,varchar 是答案。在发布问题之前,我尝试将其转换为 int.没运气。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多