当前位置: 首页 > 知识库问答 >
问题:

SSIS-自动增量字段未与数据流任务正确插入

卢锋
2023-03-14

我正在尝试使用SSIS将数据从一个数据库复制到另一个数据库。我使用SQL Server导入导出向导创建了dtsx包。我正在复制的表的列名为“id”,另一个表的名称为“moduleCategoryid”,我将它们映射在一起。

ModuleCategoryId是标识,它的自动增量为1。在源数据库中,ID不排序,如下所示:

  • 32名称1
  • 14名称2
  • 7名称3
    null

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

如果我手动为该表设置Identity Insert on,我就可以用任何我想要的ModuleCategoryId插入行,所以它必须是带有数据流的东西。

共有1个答案

戚学文
2023-03-14

表定义就是表定义--不管sugar ORM工具可能覆盖的语法如何。

我创建了一个源和目标表,并填充源以匹配您提供的数据。我也在目标表上定义了identity属性。我不知道valueGeneratedonAdd是否像API中那样实现,但几乎必须是这样,否则Enable Identity插入就会失败(如果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)
);
ModuleCategoryId|Name
32|Name1
14|Name2
7|Name3
33|Inserted naturally

下一种情况是获取相同的包并取消检查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
ModuleCategoryId|Name
34|Inserted naturally
35|Name1
36|Name2
37|Name3
 类似资料:
  • 我试图在表中插入一行,带有一个自动递增字段,但我遇到了错误。该表的结构为: id:自动增量 级别:文本 概念:文本 . 在w3c中,我了解到要将新记录插入表中,我们不必为“自动增量”列指定值(将自动添加唯一值)。 我做错了什么?

  • 在数据流任务下,不是将源数据库的SQL查询放入查询窗口:我看到了OLE DB数据源-1的数据访问模式下的四个选项。表或视图2。视图名称变量3的表。SQL命令4。来自变量的SQL命令 我知道我可以使用一个变量,将查询存储在变量中,并在“执行SQL任务”中引用它,但我正在寻找一种方法,将所有查询存储在SQL文件中,并将其存储在数据流组件中以及“执行SQL脚本任务”中。我似乎找不到一种方法使它在数据流任

  • 我有以下php代码,试图 a)要求用户输入学校密码b)查找数据库表“教师”,然后将新值(输入文本框)覆盖在数据库中学校密码的旧值上。 目前的问题是,它确实用新输入的pin向表添加了一行,但我希望它覆盖该特定教师的现有值(基本上覆盖现有值)。 php处理程序代码如下: HTML表单代码: 数据库结构(tbl:教师)字段如下所示 发生这种情况的页面上有一名教师登录,因此他们的用户名显示在屏幕上。 更新

  • 问题内容: 关于如何从通过调用读取分配给新创建的记录的自动递增身份字段的任何建议? 我知道如何在多个数据库平台的SQL中执行此操作,但是我想知道存在哪些数据库独立接口来执行此操作,以及有关人们在整个数据库平台上的经验的任何输入。 问题答案: 以下代码片段应做ya’: 已知这可用于以下数据库 德比 的MySQL SQL服务器 对于不起作用的数据库(HSQLDB,Oracle,PostgreSQL等)

  • 我正在使用java中的MySQL库执行一个查询。在我的数据库结构中,有一列名为(主键,非空且自动递增)。通常在每次插入查询中,我都将值设置为,在查询执行后,它会增加最后一个id,但在java中这样做会给我异常。 这就是代码: 如何使用自动增量ID执行查询?

  • 字段自增 const flow = await this.ctx.model.Flow.findOne({ where: { art_id } }); await flow.increment('index', { by: 900 }); 字段自减 const flow = await this.ctx.model.Flow.findOne({ where: { art_id } }); awai