Оператор вставки значений может содержать только постоянные литеральные значения или ссылки на переменные в хранилище данных SQL - PullRequest
0 голосов
/ 25 мая 2018

Рассмотрим эту таблицу:

CREATE TABLE t (i int, j int, ...);

Я хочу вставить данные в таблицу из набора SELECT операторов.Упрощенная версия моего запроса:

INSERT INTO t VALUES ((SELECT 1), (SELECT 2), ...);

Реальный запрос может быть гораздо более сложным, а отдельные подзапросы независимыми.К сожалению, этот стандартный оператор SQL (который работает на SQL Server) не работает на хранилище данных SQL.Возникает следующая ошибка:

Не удалось выполнить запрос.Ошибка: оператор вставки значений может содержать только константные литеральные значения или ссылки на переменные.

Есть ли способ обойти это?

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Вы также можете просто выполнить оператор CREATE TABLE AS SELECT (CTAS) .Это дает вам полную поддержку синтаксиса в инструкции SELECT и контроль формы таблицы (тип распределения, тип индекса) в инструкции.Заявление CTAS полностью парализовано.

0 голосов
/ 03 августа 2018

Странный синтаксис, но он работает.Вот более сложный пример:

CREATE TABLE [MDM].[Fact_Management_Curve]
(
 [Scenario_ID] INT NOT NULL,
 [FundingYYYYMM] CHAR(6) NOT NULL,
 [CollectionYYYYMM] CHAR(6) NOT NULL,
 [CorpID] INT NOT NULL,
 [Multipler] FLOAT NOT NULL
)
GO

INSERT INTO [MDM].[Fact_Management_Curve]
SELECT (SELECT 1), 201701, 201701, 21, 0.010170154301011 UNION ALL
SELECT (SELECT 1), 201701, 201702, 21, 0.010170278901234 UNION ALL
SELECT (SELECT 1), 201701, 201703, 21, 0.010170375659900 UNION ALL
SELECT (SELECT 1), 201701, 201704, 21, 0.010170482998344
GO

SELECT * FROM  [MDM].[Fact_Management_Curve]
ORDER BY 1,2,3,4;
Scenario_ID  FundingYYYYMM  CollectionYYYYMM  CorpID  Multipler
1            201701         201701            21      0.010170154301011
1            201701         201702            21      0.010170278901234
1            201701         201703            21      0.0101703756599
1            201701         201704            21      0.010170482998344
0 голосов
/ 25 мая 2018

Похоже, что есть несколько ограничений на оператор INSERT .. VALUES хранилища данных SQL, но нет никаких на INSERT .. SELECT.Запрошенный запрос можно переписать в:

INSERT INTO t SELECT (SELECT 1), (SELECT 2);

Этот обходной путь также полезен при вставке нескольких строк:

-- Doesn't work:
INSERT INTO t VALUES ((SELECT 1), 2), ((SELECT 2), 3), ...;

-- Works:
INSERT INTO t SELECT (SELECT 1), 2 UNION ALL SELECT (SELECT 2), 3;
...