SQL Server 和 Oracle 兼容的多行插入?
Posted
技术标签:
【中文标题】SQL Server 和 Oracle 兼容的多行插入?【英文标题】:SQL Server and Oracle compatible multi-row insert? 【发布时间】: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 个单独插入语句的数据库无关脚本。平面文件的加载速度也会更快。 这是一个很好的建议,但我们这样做的部分原因是我们将这些脚本以及代码交付给了客户。他们有能力浏览脚本并根据需要进行修改。不过我会记住这一点。 【参考方案1】:评论有点长。
如果您需要同时适用于 SQL Server 和 Oracle 的代码,则定义一个 dual
表:
create table dual (dummy int);
insert into dual (dummy) (1);
然后就可以使用union all
和from dual
的方法了。
您明确询问多行插入。显然,另一种选择是为每一行单独的 insert
语句。
【讨论】:
我们已经使用了数千个插入语句。我试图找出一种重构它以减小文件大小并使其更容易修改和添加值的好方法。一个例子是,我们的一个文件是 27,000 行长,插入到(每个、列、列出,这里)语句中,其中值本身可以是一对文本值,然后是 20 个整数或空值。这只是使文件本身显着膨胀。我还了解到,许多单行插入语句的效率远低于批量插入,因此我们可以加快持续集成。 另外,您的建议似乎不起作用。如果我在某个地方搞砸了,请解释一下:创建表测试( testCol1 varchar(32), testCol2 varchar(32), CONSTRAINT PK_TEST PRIMARY KEY (testCol1) );创建表对偶( testCol1 varchar(32), testCol2 varchar(32) ); INSERT INTO test SELECT 'hi', 'test' FROM dual UNION ALL SELECT 'again','test' FROM dual 这不会插入任何记录。 @EddieHartman SQL Server db<>fiddle 与 Oracle db<>fiddle 的声明相同 @MT0 谢谢。我没有在对偶表中插入任何值,所以它会插入 0 个值。查找“sql dummy”(多么棒的谷歌搜索)和双表解释了这意味着什么。谢谢你们。以上是关于SQL Server 和 Oracle 兼容的多行插入?的主要内容,如果未能解决你的问题,请参考以下文章
请教到底哪个版本的SQLServer数据库才兼容Vista?内详