gpt4 book ai didi

sql - EXEC(query) AT linkedServer 与 Oracle DB

转载 作者:行者123 更新时间:2023-12-03 03:35:21 26 4
gpt4 key购买 nike

我正在使用 Microsoft SQL Server 2005。我需要在 SQL Server 和 Oracle 数据库之间同步数据。我首先需要了解Oracle端的数据计数是否具有某些过滤器(这里我以ID作为简单的例子)。

SELECT COUNT(*) FROM oracleServer..owner.table1 WHERE id = @id;

我遇到的问题是,线路服务器或Oracle上的表非常大,有4M行数据。上述查询大约需要2分钟才能获取数据。这段代码只是一个简单的片段。实际上我的 SP 还有一些其他查询需要更新,将数据从 lined 服务器插入到我的 SQL 服务器。 SP 需要几个小时或 10 多个小时才能运行大型 Oracle 数据库。因此带有内联服务器的 T-SQL 对我来说并不好。

最近我发现了 OPENQUERY 和 EXEC (...) AT linedServer。 OPENQUERY() 非常快。大约花费了0时间就得到了同样的结果。但是,它不支持变量查询或表达式。查询必须是文字常量字符串。

EXEC() 与向 Oracle 传递查询的方式相同。它也很快。例如:

EXEC ('SELECT COUNT(*) FROM owner.table1 WHERE id = ' + CAST(@id AS VARCHAR))
AT oracleServer

我遇到的问题是如何将结果 COUNT(*) 传回。我尝试在网络和 msdn 中搜索 google 示例。我能找到的只是 SQL 或 ExpressSQL linedServer 示例,例如:

EXEC ('SELECT ? = COUNT(*) FROM ...', @myCount OUTPUT) AT expressSQL

此查询不适用于 Oracle。看来在Oracle中,您可以通过以下方式将值设置为输出:

SELECT COUNT(*) INTO myCount ...

我尝试过这个:

EXEC ('SELECT COUNT(*) INTO ? FROM ...', @myCount OUTPUT) AT oracleServer
EXEC ('SELECT COUNT(*) INTO : FROM ...', @myCount OUTPUT) AT oracleServer
EXEC ('SELECT : = COUNT(*) FROM ...', @myCount OUTPUT) AT oracleServer

这些都没有工作。我收到错误消息,指出查询无法在 Oracle 服务器上执行。

我可以编写一个 .Net SQL Server 项目来完成这项工作。在此之前,我只是想知道是否有办法将值作为输出参数传递出去,以便我将性能更好的 T-SQL 代码放入我的 SP 中?

最佳答案

对此进行快速更新。我想我找到了解决方案。我在Dev NewsGroup上关于类似问题的讨论中找到了它。 。根据信息,我尝试了以下方法:

DECLARE @myCount int;
DECLARE @sql nvarchar(max);
set @sql =
N'BEGIN
select count(*) into :myCount from DATAPARC.CTC_MANUAL_DATA;
END;'
EXEC (@sql, @myCount OUTPUT) AT oracleServer;
PRINT @myCount; -- 3393065

哇!直接在 Orable DB 上比较 T-SQL 查询,我在 3 秒内得到了结果(+2 分钟)。重要的是使用“BEGIN”和“END;”将查询包装为匿名 block 并且不要错过“;”结束后

您需要匿名 block 作为输出参数。如果您只有输入或没有参数,则不需要该 block 并且查询可以正常工作。

尽情享受吧!顺便说一句,这是一个快速更新。如果你不再见到我,我就不会在这个问题上遇到任何麻烦。

关于sql - EXEC(query) AT linkedServer 与 Oracle DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/595350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com