MS SQL 链接服务器 - 延迟准备无法完成

MS SQL linked server - Deferred prepare could not be completed

我在 MS SQL 中使用 OPENQUERY 从链接服务器查询时遇到问题。已经针对此问题提出了一些主题和解决方案,但没有一个解决这个问题。

现在,我正在尝试 运行 以下程序,该程序用于将所有新数据从一个数据库复制到另一个数据库:

USE_GS_DB

SET NOCOUNT ON;

DECLARE @tsql varchar(8000);
DECLARE @idexternal varchar(255);
DECLARE @timeexternal datetime;

SET @idexternal = (SELECT external_id FROM dbo.insert_data WHERE test_type = 1);
SET @timeexternal = (SELECT external_time FROM dbo.insert_data WHERE test_type = 1);

SELECT @tsql = '
SELECT * FROM OPENQUERY(TESTSERVER, ''
SELECT [open_test_uuid]
      ,[time_utc]
      ,[client_version]
FROM [GS_DB].[dbo].[table_data] WHERE [time_utc] >= ''' + convert(varchar, @timeexternal, 121) + ''' and [open_test_uuid] <> ' +  cast(@idexternal as varchar) + ''') ';

EXEC('INSERT INTO [GS_DB].[dbo].[c_table_data]
      ([open_test_uuid]
      ,[time_utc]
      ,[client_version])' + @tsql)

@idexternal@timeexternal 设置在另一个 table 中,每次发生复制时都会被最后一次输入覆盖(由触发器设置)。

我已经尝试 运行 仅在没有 WHERE 条件的过程的第一部分(带有 OPENQUERY 的部分)并且一切都按预期进行,但是一旦我添加条件,我就会收到以下消息(无论我使用变量还是只输入参数都无所谓):

OLE DB provider "SQLNCLI11" for linked server "TESTSERVER" returned message "Deferred prepare could not be completed.". Msg 8180, Level 16, State 1, Line 1 Statement(s) could not be prepared. Msg 102, Level 15, State 1, Line 5 Incorrect syntax near '1'.

我对另一个数据库有类似的程序,它运行没有任何问题。有人对此问题有任何解决方案或评论吗?

我认为问题出在您正在构造的 WHERE 子句的语法中:

...WHERE [time_utc] >= ' + cast(@timeexternal as varchar) + 'and...

这是在构建一个 SQL 字符串,如 ...WHERE [time_utc] >= Jun 22 2015 3:56PMand...,然后无法准备,因为它无效 SQL。 尝试如下操作:

select '...WHERE [time_utc] >= ''' + convert(varchar, @timeexternal, 121) + ''' and...'