【发布时间】:2020-05-16 12:47:12
【问题描述】:
我正在寻找与 Oracle 11g 和 SQL Server 2008 向前版本兼容的多行插入查询。
我们必须同时支持这两种数据库并生成适用于这两种数据库的脚本。我们为每个数据库上的特定内容拆分了一些脚本部分,但有大量常见的 INSERT INTO 语句一次运行一个。
提高性能的一种方法是将这数千个插入语句合并到多行插入中。如果不将这些常见的脚本部分文件再次拆分为单独的文件,就没有办法做到这一点吗?我们希望尽可能避免这种情况,以避免在进行更改时必须更新两个文件中的数据。
我看到的大多数 SO 结果都是针对 Oracle 或 SQL Server 执行多行插入,但在插入新值时,我看到的答案都没有兼容。
我也看过这个维基百科条目:https://en.wikipedia.org/wiki/Insert_(SQL)
并用下面的脚本尝试了一些测试。
create table test (
testCol1 varchar(32),
testCol2 varchar(32),
CONSTRAINT PK_TEST PRIMARY KEY (testCol1)
);
--compatible with sql server, but not oracle
insert into test (testCol1, testCol2) values
('hi', 'test'),
('again', 'test');
--works in Oracle, but not SQL Server
INSERT ALL
INTO test values ('hi', 'test')
INTO test values ('again', 'test')
SELECT * FROM DUAL
--works in SQL Server, but not Oracle
INSERT INTO test
SELECT 'hi', 'test'
UNION ALL
SELECT 'again','test'
--works in Oracle, but not SQL Server
INSERT INTO test
SELECT 'hi', 'test' FROM DUAL
UNION ALL
SELECT 'again','test' FROM DUAL
--"standard-conforming" but works in neither?
INSERT INTO test ("testCol1", "testCol2")
SELECT 'hi', 'test' FROM LATERAL ( VALUES (1) ) AS t(c)
UNION ALL
SELECT 'again','test' FROM LATERAL ( VALUES (1) ) AS t(c)
有什么建议或我缺少的任何东西吗?谢谢。
【问题讨论】:
-
您确定首先将其构建为插入语句是有意义的(特别是如果性能是一个问题)? SQL Server 和 Oracle(实际上是任何其他数据库)都可以通过几行代码非常快速地将数据文件提取到表中。我宁愿用十几行特定于数据库的代码来加载数据,并拥有一个包含 27,000 行数据的平面文件,我可以在 Excel/我最喜欢的文本编辑器中打开,而不是使用具有 27,000 个单独插入语句的数据库无关脚本。平面文件的加载速度也会更快。
-
这是一个很好的建议,但我们这样做的部分原因是我们将这些脚本以及代码交付给了客户。他们有能力浏览脚本并根据需要进行修改。不过我会记住这一点。
标签: sql sql-server oracle sql-server-2008 oracle11g