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...'
我在 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...'