将具有计算值和默认值的表插入到表中

Cas*_*ton 0 sql t-sql sql-server sql-server-2017

我有一个TableA包含几列的列,其中一列是一个Computed值,另一列是a DateTime的默认值GETDATE()

然后,我有另一个表,TableA_Staging我想将其用作批量插入的原始转储表。该表看起来很像TableA,但有一些预期的差异,其中之一就是其中没有ComputedDateTime列。

批量插入后TableA_Staging,现在需要将数据从TableA_Staging移到TableA。我在这两列中遇到了麻烦。让我们假设 TableA看起来像这样:

TableA
-----------
TableAId (INT non-unique, non-auto-incrementing PK)
Column1 (String PK)
Column2
ColumnComputed
ColuomnDateTime
Run Code Online (Sandbox Code Playgroud)

和...

TableA_Staging
-----------
TableAID (this value populated in C# code)
Column1 
Column2
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试这样做:

INSERT INTO TableA
SELECT TableAID, Column1, Column2 FROM TableA_Staging WHERE TableAID > X
Run Code Online (Sandbox Code Playgroud)

但是我得到这个错误:

列名或提供的值数与表定义不匹配。

我认为这是在抱怨,因为我没有为ColumnComputed或提供任何东西ColuomnDateTime?但是,如果是这样,我认为我不需要为它们提供值,因为其中一个是经过计算的,而另一个具有默认值。

小智 5

您应该始终在要从选择中插入的插入语句中包括列,否则,总是必须在插入中提供与选择相同的列数。

另外,如果您的TableID是自动递增/身份,则不需要包含它。

INSERT INTO TableA (TableBID, Column1, Column2)
SELECT TableAID, Column1, Column2 
FROM TableA_Staging WHERE TableAID > X
Run Code Online (Sandbox Code Playgroud)