Я ищу запрос на вставку из нескольких строк, совместимый с версиями Oracle 11g и SQL Server 2008 вперед.
Мы должны поддерживать обе базы данных и создавать сценарии, которые будут работать на обоих , У нас есть несколько разделов скриптов, разделенных для определенных c вещей в каждой базе данных, но есть большие общие операторы INSERT INTO, которые запускаются по одному за раз.
Один из способов повысить производительность - взять эти тысячи вставлять в операторы и связывать их в многострочные вставки. Нет ли способа сделать это, не разделив эти общие файлы разделов скрипта на отдельные файлы? Мы хотели бы избежать этого, если это возможно, чтобы избежать необходимости обновления данных в двух файлах при внесении изменений.
Большинство результатов SO, которые я видел, касались выполнения многострочных вставок для Oracle ИЛИ SQL Сервера, но ни один из ответов, которые я видел, не совместим при вставке НОВЫХ значений.
Я также просматривал эту запись в Википедии: 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)
Любой совет или что-то, что я пропускаю? Спасибо.