Insert values 语句在 SQL 数据仓库中只能包含常量文字值或变量引用

Insert values statement can contain only constant literal values or variable references in SQL Data Warehouse

考虑这个table:

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

我想从一组 SELECT 语句中将数据插入到 table 中。我的查询的简化版本是:

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

真正的查询可能要复杂得多,而且各个子查询是独立的。不幸的是,此标准 SQL 语句(适用于 SQL 服务器)不适用于 SQL 数据仓库。出现以下错误:

Failed to execute query. Error: Insert values statement can contain only constant literal values or variable references.

有办法解决这个问题吗?

SQL 数据仓库的 INSERT .. VALUES 语句似乎有一些限制,但 INSERT .. SELECT none 语句有一些限制。请求的查询可以重写为:

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;

您也可以只 运行 一条 CREATE TABLE AS SELECT (CTAS) 语句。这为您提供了 SELECT 语句中的完整语法支持和语句中 table 形状(分布类型、索引类型)的控制。 CTAS 语句是完全并行化的。

奇怪的语法,但它有效。这是一个更复杂的例子:

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

供您参考...

INSERT INTO table_name VALUES 语法只接受常量文字值或变量引用。任何类似表达式的内容都是无效的。

例如 INSERT INTO table_name VALUES (A,B,A+B)

但是 声明@C INT = A+B INSERT INTO table_name VALUES (A,B,C) 是有效的。

这里的 A+B 就像任何一种表达式,所以它会抛出类似“only accepts constant literal values or variable references”的错误