我遇到了在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'附近的语法不正确。
我有另一个数据库的类似程序,它没有任何问题。有人会对这个问题有任何解决方案或评论吗?
答案 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...'