插入值语句只能包含 SQL 数据仓库中的常量文本值或变量引用



请考虑此表:

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

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

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

实际查询可能要复杂得多,并且各个子查询是独立的。不幸的是,此标准 SQL 语句(适用于 SQL Server(不适用于 SQL 数据仓库。引发以下错误:

无法执行查询。错误:插入值语句只能包含常量文本值或变量引用。

有没有办法解决这个问题?

SQL 数据仓库的INSERT .. VALUES语句似乎有一些限制,但在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;

您也可以只运行 CREATE TABLE AS SELECT (CTAS( 语句。这为您提供了 SELECT 语句中的完整语法支持和对语句中表形状(分布类型、索引类型(的控制。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

供您参考...

插入到table_name值语法仅接受常量文本值或变量引用。任何类似表达式的内容都是无效的。

例如插入table_name值 (A,B,A+B(

声明@C INT = A+B 插入到table_name值 (A,B,C(是有效的值。

这里 A+B 就像任何类型的表达式一样,所以它会抛出错误,比如">只接受常量文字值或变量引用">

最新更新