SQL Сервер и Oracle совместимая многорядная вставка? - PullRequest
0 голосов
/ 30 января 2020

Я ищу запрос на вставку из нескольких строк, совместимый с версиями 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)

Любой совет или что-то, что я пропускаю? Спасибо.

1 Ответ

4 голосов
/ 30 января 2020

Это немного длинно для комментария.

Если вам нужен код, который работает как на SQL Сервере, так и Oracle, то определите таблицу dual:

create table dual (dummy int);

insert into dual (dummy) (1);

Тогда вы сможете использовать метод, который использует union all и from dual.

Вы явно спрашиваете о многострочных вставках. Очевидно, что альтернативой является отдельный оператор insert для каждой строки.

...