表定义是表定义 - 无论 ORM 工具可能覆盖何种语法糖。
我创建了一个源表和目标表,并填充了源以匹配您提供的数据。我也在目标表上定义了身份属性。这是否是 ValueGeneratedOnAdd 在 API 中实现的,我不知道,但它几乎必须是,否则启用身份插入应该失败(如果 UI 甚至允许它)。
IDENTITY 属性允许您使用所需的任何初始值对其进行播种。对于 taget 表,我以有符号整数允许的最小值为种子,这样如果身份插入不起作用,结果值看起来真的“错误”
DROP TABLE IF EXISTS dbo.SO_67370325_Source;
DROP TABLE IF EXISTS dbo.SO_67370325_Destination;
CREATE TABLE dbo.SO_67370325_Source
(
Id int IDENTITY(1,1) NOT NULL
, Name varchar(50)
);
CREATE TABLE dbo.SO_67370325_Destination
(
ModuleCategoryId int IDENTITY(-2147483648,1) NOT NULL
, Name varchar(50)
);
CREATE TABLE dbo.SO_67370325_Destination_noident
(
ModuleCategoryId int NOT NULL
, Name varchar(50)
);
SET IDENTITY_INSERT dbo.SO_67370325_Source ON;
INSERT INTO DBO.SO_67370325_Source
(
Id
, Name
)
VALUES
(32, 'Name1')
, (14, 'Name2')
, (7, 'Name3');
SET IDENTITY_INSERT dbo.SO_67370325_Source OFF;
INSERT INTO dbo.SO_67370325_Source
(
Name
)
OUTPUT Inserted.*
VALUES
(
'Inserted naturally' -- Name - varchar(50)
);
除了您提供的 3 个值之外,我添加了第四个值,如果您运行提供的查询,您会看到生成的 ID 很可能是 33。创建源表时标识为 1,但显式标识插入源table 将种子值提前到 32。假设没有其他活动发生,下一个值将是 33,因为我们的增量是 1。
话虽如此,我已经建立了 3 个场景。在 Import Export 向导中,我检查了 Identity Insert 并将 Id 映射到 ModuleCategoryId 并运行包。
ModuleCategoryId|Name
32|Name1
14|Name2
7|Name3
33|Inserted naturally
目标表中的数据与源表中的数据相同 - 正如预期的那样。此时,身份种子位于 33,我可以使用一些我不方便的 DBCC 检查命令进行验证。
下一种情况是采用相同的包并取消选中 Identity Insert 属性。这变得无效,因为我会收到错误报告
插入只读列“ModuleCategoryId”失败
唯一的选择是将 Id 取消映射到 ModuleCategoryId。假设我像以前一样加载到同一个表中,我会看到类似这样的数据
ModuleCategoryId|Name
34|Name1
35|Name2
36|Name3
37|Inserted naturally
如果我从未将记录放入此表中,那么我会得到类似的结果
ModuleCategoryId|Name
-2147483648|Name1
-2147483647|Name2
-2147483646|Name3
-2147483645|Inserted naturally
如果我的来源没有明确的订单,则无法保证订单的结果。我经常打这场仗。 SQL 引擎没有义务以主键顺序或任何其他此类顺序返回数据,除非您明确要求。如果存储了以下结果,则同样有效。
ModuleCategoryId|Name
34|Inserted naturally
35|Name1
36|Name2
37|Name3
如果您需要根据源表中 Id 的升序值将数据插入到目标表中,则在导入/导出向导中,您需要转到询问是否要选择表或编写查询并选择查询的第二个选项。然后你会写SELECT * FROM dbo.SO_67370325_Source ORDER BY Id; 或任何你的源表被命名。
加载 SO_67370325_Destination_noident 的最终测试演示了一个未定义身份属性的表。如果我没有将 Id 映射到 ModuleCategoryId,则包将失败,因为该列被定义为 NOT NULL。当我将 Id 映射到 ModuleCategoryId 时,我将看到与第一个 (7,14,32,33) 相同的结果,但是,每个后续插入目标表都必须提供自己的 Id,它可能与什么对齐也可能不对齐你的 FluentAPI 东西可以。
类似的问题/答案Error 0xc0202049: Data Flow Task 1: Failure inserting into the read-only column