如果我尝试使用SSIS在具有主键的表中插入两行不同的行,如何确定哪一行写到表中以及哪一行由错误记录任务处理?
例如,我有一个具有两列和一个主键约束的目标表,并且我试图从源表中插入两行具有相同值但没有主键约束的行。
namespace Bookshelf.Data.Migrations
[DbContext(typeof(ApplicationDbContext))]
partial class ApplicationDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
...
modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b =>
{
b.Property<string>("Id")
.ValueGeneratedOnAdd();
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken();
b.Property<string>("Name")
.HasMaxLength(256);
b.Property<string>("NormalizedName")
.HasMaxLength(256);
b.HasKey("Id");
b.HasIndex("NormalizedName")
.IsUnique()
.HasName("RoleNameIndex")
.HasFilter("[NormalizedName] IS NOT NULL");
b.ToTable("AspNetRoles");
});
如果我有两行具有相同的主键,尝试同时插入两者将导致SSIS包崩溃,但是如果我添加错误日志记录来记录重复的行,则我有1/2机会记录错误的记录
(KeyColumn UNIQUEIDENTIFIER NOT NULL, TextColumn VARCHAR(50) NULL)
只要我能始终如一地确定有效记录(例如:| KeyColumn | TextColumn |
| 1 | 'ValidRecord' |
| 1 |'InvalidRecord'|
| 2 | 'ValidRecord' |
永远不要包含文本TextColumn
),如何创建SSIS任务以始终将正确的记录写入我的SSIS表并发送记录任务记录不正确?
答案 0 :(得分:1)
您可以使用2种方法实现这一目标:
如果您需要根据KeyColumn检查重复项(第一次出现是有效的,其他是无效的),则可以使用脚本组件来实现。
DT_BOOL
的输出列(示例名称:标志)在脚本内部使用类似的脚本:
using System.Collections.Generic;
public class ScriptMain:
UserComponent
{
List<string> lstKey = new List<string>;
public override void Input0_ProcessInputRow(InputBuffer0 Row)
{
if(!lstKey.Contains(Row.KeyColumn.ToString()){
lstKey.Add(Row.KeyColumn.ToString());
Row.Flag = true;
}else{
Row.Flag = false;
}
}
}
添加条件拆分以使用类似的表达式基于Flag
列值拆分行:
[Flag] == True
将True
路径映射到目标表,并将False
路径映射到错误日志记录目标
如果您可以根据文本列检查orw是否有效,则可以使用以下表达式添加条件拆分:
FINDSTRING([TextColumn],'InvalidRecord',1) == True
答案 1 :(得分:0)
在OLEDb目标编辑器中,有“每批行数”设置,您可以在其中输入1。然后,当SSIS失败时,您将获得失败的记录。
类似的注释- 在您提供的表中,键列不能包含两行,且两行的值均为1。您应该能够在登台表中处理此问题。
一个附加地址。处理此问题的方法是在键列上查找并将现有键转移到其他任务。
答案 2 :(得分:0)
如果可以一致地确定哪些行是好是坏,则可以使用条件拆分并编写表达式以根据该表达式转移行。这是最简单的方法。