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

时间:2015-06-18 13:56:44

标签: sql-server stored-procedures sql-server-2012

我遇到了在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设置在另一个表中,每次发生复制时都会被上次输入覆盖(由触发器设置)。

我试图只运行程序的第一部分(一个OPENQUERY)没有WHERE条件,一切都按预期工作,但是一旦我添加条件,我得到以下消息(无关紧,如果我使用变量或者我只输入参数):

  

返回链接服务器“TESTSERVER”的OLE DB提供程序“SQLNCLI11”   消息“延期准备无法完成。” Msg 8180,等级   16,无法准备国家1,第1行声明。 Msg 102,等级   15,状态1,行5'1'附近的语法不正确。

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

1 个答案:

答案 0 :(得分:1)

我认为问题在于您正在构建的WHERE子句的语法:

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

这是构建一个像...WHERE [time_utc] >= Jun 22 2015 3:56PMand...这样的SQL字符串,然后无法准备,因为它不是有效的SQL。 尝试以下内容:

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