如何通过Open Query查询Postgres链接服务器中晚于SQL Server的datetime2数据
我需要识别Postgres数据库中本地SQL Server 2017尚未同步的新数据,将其下载到本地SQL Server。目前通过链接服务器连接Postgres,使用OPENQUERY进行操作。
现有操作步骤
- 将本地SQL Server
events表中最大的datetime2(7)值插入临时表#latest:
CREATE TABLE #latest (latest DATETIME2(7))
临时表数据如下:
| latest |
|---|
| 2023-01-26 14:40:19.1470000 |
- 链接服务器的
event表包含一个timestamp with time zone类型的time列,执行以下代码可正常返回结果:
DECLARE @Query NVARCHAR(MAX) SELECT @Query = ' SELECT [time],[eventID] FROM OPENQUERY( [PostgresServer] ,'' select "time", "eventID" from "event" t limit 1 '' )' FROM #latest EXECUTE sp_executesql @Query
返回结果:
| time | eventID |
|---|---|
| 2022-11-17 11:05:17.2450000 | 730d544e-de4b-47a7-b8d0-80742dc4240d |
遇到的错误情况
1. 语法错误
添加WHERE子句筛选大于本地最新时间的数据时,出现语法错误:
DECLARE @Query NVARCHAR(MAX) SELECT @Query = ' SELECT [time],[eventID] FROM OPENQUERY( [PostgresServer] ,'' select "time", "eventID" from "event" t where "time" > '[latest]' limit 1 '' )' FROM #latest EXECUTE sp_executesql @Query
错误提示:
Msg 102, Level 15, State 1, Line 33
Incorrect syntax near 'latest'.
2. 类型不兼容错误
尝试用+拼接类型转换后的latest值时,出现类型不兼容错误:
The data types varchar and datetime2 are incompatible in the add operator.
3. OLE DB提供器错误
修改为以下写法后,出现OLE DB提供器相关错误:
where "time" > '+CAST([latest] AS NVARCHAR(100))+'
错误提示:
Msg 7399, Level 16, State 1, Line 22
The OLE DB provider "MSDASQL" for linked server "PostgresServer" reported an error. The provider did not give any information about the error.
Msg 7350, Level 16, State 2, Line 22
Cannot get the column information from OLE DB provider "MSDASQL" for linked server "PostgresServer".
求助
请问有没有更好的方法识别链接服务器上的新数据?或者如何修复上述错误?
内容的提问来源于stack exchange,提问作者thedegatron

