Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SSIS-未在数据流任务中正确插入自动增量字段_Sql Server_Ssis - Fatal编程技术网

Sql server SSIS-未在数据流任务中正确插入自动增量字段

Sql server SSIS-未在数据流任务中正确插入自动增量字段,sql-server,ssis,Sql Server,Ssis,我正在尝试使用ssis将数据从一个数据库复制到另一个数据库。我使用SQLServer导入和导出向导创建了dtsx包。 我从中复制的表有一个列名“Id”,另一个表有一个名称“ModuleCategoryId”,我将其映射在一起 ModuleCategoryId是标识,自动递增为1。 在源数据库中,Id不按顺序排列,如下所示: 32姓名1 14姓名2 7姓名3 执行数据流后,目标数据库如下所示: 1姓名1 2姓名2 3姓名3 我在向导中启用了标识插入,但这没有任何作用。 目标数据库采用实体

我正在尝试使用ssis将数据从一个数据库复制到另一个数据库。我使用SQLServer导入和导出向导创建了dtsx包。 我从中复制的表有一个列名“Id”,另一个表有一个名称“ModuleCategoryId”,我将其映射在一起

ModuleCategoryId是标识,自动递增为1。 在源数据库中,Id不按顺序排列,如下所示:

  • 32姓名1
  • 14姓名2
  • 7姓名3
执行数据流后,目标数据库如下所示:

  • 1姓名1
  • 2姓名2
  • 3姓名3
我在向导中启用了标识插入,但这没有任何作用。

目标数据库采用实体框架,代码优先

如果我显式地关闭ValueGeneratedOnAdd,并重新生成目标数据库,那么数据传输是正确的,但是我想知道是否有一种方法可以在不关闭自动增量的情况下传输所有数据,然后再将其打开


如果我手动为该表设置Identity Insert,我可以插入任何ModuleCategoryId的行,因此它必须与数据流有关。

表定义是表定义,而不管ORM工具可能覆盖的语法是什么

我创建了一个源和目标表,并填充源以匹配您提供的数据。我也在目标表上定义了identity属性。我不知道这是否是API中实现的
ValueGeneratedOnAdd
,但几乎必须如此,否则启用标识插入会失败(如果UI允许的话)

IDENTITY属性允许您使用所需的任何初始值对其进行种子设定。对于taget表,我以有符号整数允许的最小值进行种子设定,这样,如果标识插入不起作用,结果值将看起来真的“错误”

除了您提供的3个值之外,我还添加了第四个值,如果您运行提供的查询,您将看到生成的ID可能是33。创建源表时,标识种子为1,但在源表上插入的显式标识将种子值提前到32。假设没有其他活动发生,下一个值将是33,因为我们的增量是1

综上所述,我已经确定了3个场景。在导入导出向导中,我检查了标识插入并将Id映射到ModuleCategoryId,然后运行包

ModuleCategoryId|Name
32|Name1
14|Name2
7|Name3
33|Inserted naturally
目标表中的数据与源表中的数据相同-如预期的那样。在这一点上,标识种子位于33,我可以用一些我手边没有的DBCC check命令来验证它

下一种情况是获取相同的包并取消选中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,包将失败,因为该列被定义为NOTNULL。当我将Id映射到ModuleCategoryId时,我将看到与第一个(7,14,32,33)相同的结果,但是,每个对目标表的后续插入都必须提供自己的Id,该Id可能与FluentAPI的功能一致,也可能不一致


类似的问题/答案

您提到了“ValueGeneratedAnd”,但我没有这方面的参考资料-您能进一步解释一下吗?使用FluentAPI可以设置ValueGeneratedAnd,这意味着每次添加一行时,ID都需要增加1。所以通常在添加一行时,我需要它,但不是对于初始数据传输,FluentAPI是实体框架的新名称吗?对于您定义的问题,是SSIS包中涉及FluentAPI,还是数据“正常”进入源表或目标表?FluentAPI是一种配置类的方法,以便数据库反映您的需要。例如,设置表之间的关系、列的数据类型等。dtsx数据包中未使用此功能。感谢您的回复。您提到的一件事是,如果在向导中取消选中“Identity Insert”,则Insert会抛出一个错误。我不是这样的。即使我不选中它,行也会被转移。然后我查看了目标表中的ModuleCategoryId列,它被设置为Identity,因此我认为如果不选中它,它应该会失败。作为一项附加测试,我尝试在没有激活identity insert的情况下向表中插入几行,但失败了。因此,我决定在visual studio中从头开始创建dtsx包,并在OLE DB目标上将数据访问模式设置为table view-fast load,选中“Keep identity”和未选中“check constraints”。对数据库中的所有表执行此操作。这解决了我的问题。我不知道向导中的“启用标识插入”复选框是否不起作用,或者这是否不是我的实际问题,但我已经让它起作用了
ModuleCategoryId|Name
34|Inserted naturally
35|Name1
36|Name2
37|Name3