链接服务器上的相同插入语句,不同的行为

问题描述 投票:0回答:1

我有一个插入语句基本上是这样的:

insert into openquery(Test_LinkedServer, 
                      'select a,b,c from my_ora_table')
    select a, b, c 
    from my_dbo_table;

当我执行它时,它会运行并且控制台返回“xx rows受影响”消息。

当我尝试第二次执行它时,不做任何更改,我收到“OLE DB 提供程序”错误:

提供的元数据不一致。在执行期间提供了一个在编译时未找到的额外列

如果我在

OPENQUERY
中的SQL语句中添加额外的空格:

insert into openquery(Test_LinkedServer, 
                      'select a,b(extra_space),c from my_ora_table')

再次有效1次。

它是否有某种安全措施来阻止多次执行相同的解析 SQL?

  • 源数据库:SQL Server

  • SQL 客户端:Microsoft SQL Server Management Studio

  • 目标数据库:Oracle

我的链接服务器提供商:

  • OraOLEDB.Oracle

我的链接服务器属性:

  • 允许进程内
  • 嵌套查询
sql-server oracle ssms linked-server
1个回答
0
投票

不完全是一个答案,但这是我超级讨厌的解决方法,至少目前是这样:

当您的查询被解析以供执行时,就会出现此问题。如果是第一次,就成功了。如果您要立即重新执行它,则会失败。

所以我添加了一个虚拟注释行,并将其替换为运行时的一些随机数。它弄乱了第一个元数据,因为字符串被更改了。

declare @i nvarchar(max);
declare @s nvarchar(max);

set @i = '
insert into openquery(Test_LinkedServer, 
                      ''select a,b,c /*pseudo_placeholder*/ from my_ora_table'')';
set @s = '
    select a, b, c 
    from my_dbo_table';


begin
set @i = replace(@i, 'pseudo_placeholder', floor(1+(500-1+1)*rand()));
end

exec (@i+@s);

现在可以连续执行了。

© www.soinside.com 2019 - 2024. All rights reserved.