2013-03-07 52 views
8

问题问题与SSIS包

在经过几个月下面描述的过程没有任何问题已经工作加载数据时,了解间歇不一致绝大多数已运行时间(2008 R2)。然而,我们有三个错误连接的数据。问题是,是什么造成了这种情况,我该如何补救?

DATA_PreImp 

    sourceid col01 col02 col03 col04 col... 
    100001  John Smith 
    100002  Calvin Klein 
    100003  Peter Parker 
    100004  Moe  Greene 

一般所呈现的结果是该属性被连接到Items_Main正确,但有时(小于1%)的顺序进行加扰,使得COL01的值不被连接到相同的Items_Main为的值其余的列。

任何有关这是什么导致的见解将不胜感激。

的数据移动过程

我们有一个SSIS包从称为DATA_PreImp到(基于属性)由三个相关的表的结构的平坦表传输数据。

  • Items_Main应该包含一个行用于DATA_PreImp每一行
  • Items_Featurevalues包含用于DATA_PreImp一个行的每个列值一行
  • Items_MainRel包含Items_Main和Items_FeatureValues

的之间的连接SSIS包中的第一步是将DATA_PreImp中的数据插入到Items_Main中,并将生成的标识符插入到空DATA_PreImpMappingTMP表中的TARGET_ID列中。

insert into items_main(creationdate, status) 
output inserted.itemid into DATA_PreImpMappingTMP(TARGET_ID) 
select getdate(), '0' from data_preimp 
order by sourceid asc; 

SSIS包第二步填充TARGET_ID(ITEMID最初)的Items_MainRel表和用于特征的标识符(在这种情况下为5)。

insert into items_mainrel(itemid, featureid) 
output inserted.itemrelid into DATA_PreImpMapping2TMP(INDREL_ID) 
select TARGET_ID, 5 from DATA_PreImpMappingTMP 
order by TARGET_ID asc; 

的第三步是从与所述DATA_PreImp SOURCE_ID填写DATA_PreImpMapping2TMP表中的列SOURCE_ID。

with cte as (select sourceid, row_number() over (order by sourceid asc) as row from data_preimp) 
update m set m.SOURCE_ID = s.sourceid, m.FEAT_ID = 5 
from DATA_PreImpMapping2TMP as m 
join cte as s on s.row = m.ROW; 

的最后一步是填充Items_FeatureValues表与来自DATA_PreImpMapping2TMP和DATA_PreImp数据。

insert into items_featurevalues(itemrelid, languageid, fnvarchar) 
select DATA_PreImpMapping2TMP.INDREL_ID, 0, data_preimp.col01 
from DATA_PreImpMapping2TMP 
join data_preimp on (DATA_PreImpMapping2TMP.SOURCE_ID = data_preimp.sourceid) 
where FEAT_ID = 5 

数据表结构

这里是什么是需要创建方案:

CREATE TABLE [dbo].[DATA_PreImp](
    [sourceid] [bigint] IDENTITY(1,1) NOT NULL, 
    [col01] [nvarchar](500) NULL, 
    [col02] [nvarchar](500) NULL, 
    [col03] [nvarchar](500) NULL, 
    [col04] [nvarchar](500) NULL, 
    [col05] [nvarchar](500) NULL, 
    [col06] [nvarchar](500) NULL, 
    [col07] [nvarchar](500) NULL, 
    [col08] [nvarchar](500) NULL, 
    [col09] [nvarchar](500) NULL, 
    [col10] [nvarchar](500) NULL, 
CONSTRAINT [PK_DATA_PreImp] PRIMARY KEY CLUSTERED 
(
    [sourceid] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 


CREATE TABLE [dbo].[DATA_PreImpMappingTMP](
    [ROW] [int] IDENTITY(1,1) NOT NULL, 
    [TARGET_ID] [int] NULL, 
PRIMARY KEY CLUSTERED 
(
    [ROW] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 


CREATE TABLE [dbo].[Items_Main](
    [Itemid] [int] IDENTITY(1,1) NOT NULL, 
    [creationDate] [smalldatetime] NOT NULL, 
    [status] [int] NOT NULL, 
    [purchdate] [smalldatetime] NULL, 
    [logindate] [smalldatetime] NULL, 
CONSTRAINT [PK_Items_Main] PRIMARY KEY CLUSTERED 
(
    [Itemid] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 


CREATE TABLE [dbo].[DATA_PreImpMapping2TMP](
    [ROW] [int] IDENTITY(1,1) NOT NULL, 
    [SOURCE_ID] [int] NULL, 
    [INDREL_ID] [int] NULL, 
    [FEAT_ID] [int] NULL, 
PRIMARY KEY CLUSTERED 
(
    [ROW] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

CREATE TABLE [dbo].[Items_Features](
    [featureId] [int] IDENTITY(1,1) NOT NULL, 
    [featureRef] [varchar](15) NOT NULL, 
    [featureName] [varchar](50) NOT NULL, 
    [creationDate] [smalldatetime] NOT NULL, 
    [status] [int] NOT NULL, 
    [fieldType] [varchar](50) NOT NULL, 
    [featureType] [int] NOT NULL, 
    [featureDesc] [varchar](500) NULL, 
CONSTRAINT [PK_Items_Features] PRIMARY KEY CLUSTERED 
(
    [featureId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] 


CREATE TABLE [dbo].[Items_MainRel](
    [ItemRelId] [int] IDENTITY(1,1) NOT NULL, 
    [Itemid] [int] NOT NULL, 
    [featureId] [int] NOT NULL, 
CONSTRAINT [PK_Items_MainRel] PRIMARY KEY CLUSTERED 
(
    [ItemRelId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

CREATE TABLE [dbo].[Items_FeatureValues](
    [valueId] [int] IDENTITY(1,1) NOT NULL, 
    [ItemRelId] [int] NOT NULL, 
    [languageId] [int] NOT NULL, 
    [FnVarChar] [nvarchar](250) NULL, 
    [FInt] [int] NULL, 
    [FImage] [int] NULL, 
    [FNText] [ntext] NULL, 
    [FSmallDateTime] [smalldatetime] NULL, 
CONSTRAINT [PK_Items_FeatureValues] PRIMARY KEY CLUSTERED 
(
    [valueId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

GO  

ALTER TABLE [dbo].[Items_MainRel] WITH CHECK ADD CONSTRAINT [FK_Items_MainRel_Items_Features] FOREIGN KEY([featureId]) 
REFERENCES [dbo].[Items_Features] ([featureId]) 
GO 

ALTER TABLE [dbo].[Items_MainRel] CHECK CONSTRAINT [FK_Items_MainRel_Items_Features] 
GO 

ALTER TABLE [dbo].[Items_MainRel] WITH CHECK ADD CONSTRAINT [FK_Items_MainRel_Items_Main] FOREIGN KEY([Itemid]) 
REFERENCES [dbo].[Items_Main] ([Itemid]) 
GO 

ALTER TABLE [dbo].[Items_MainRel] CHECK CONSTRAINT [FK_Items_MainRel_Items_Main] 
GO 


ALTER TABLE [dbo].[Items_FeatureValues] WITH CHECK ADD CONSTRAINT [FK_Items_FeatureValues_Items_MainRel] FOREIGN KEY([ItemRelId]) 
REFERENCES [dbo].[Items_MainRel] ([ItemRelId]) 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[Items_FeatureValues] CHECK CONSTRAINT [FK_Items_FeatureValues_Items_MainRel] 
GO 


INSERT INTO DATA_PreImp (col01,col02,col03,col04) 
VALUES('John', 'Smith', '1964', 'NewYork'), 
     ('Calvin', 'Klein', '1960', 'Washington D. C.'), 
     ('Peter', 'Parker', '1974', 'Losangles'), 
     ('Moe', 'Greene', '1928', 'Lasvegas') 


INSERT INTO Items_Features (featureRef, featureName, creationDate, [status], fieldType, featureType, featureDesc) 
VALUES ('firstname','First_Name', GETDATE(), 0, 'FnVarChar', 3, 'FirstName'), 
    ('lastname','Last_Name', GETDATE(), 0, 'FnVarChar', 3, 'LastName'), 
    ('Birth','Birth', GETDATE(), 0, 'FnVarChar', 3, 'Birth'), 
    ('City','City', GETDATE(), 0, 'FnVarChar', 3, 'City') 
+0

我在第二个脚本上获得外键违规。 dbo中没有记录。具有featureID = 5的Items_Features(如硬编码到该脚本中)。应该是脚本中使用的另一个featureID还是dbo.Items_Features中缺少记录? – Aphillippe 2013-03-27 09:03:58

+0

你在插入中使用交易吗? SSIS包中的错误处理是否会抛出任何有用的数据?是否有其他进程在同一个db/tables上同时运行,可能会导致并发问题? – Valkyrie 2013-04-24 14:01:59

+1

这个复杂的东西,没有真正的包装和所有的内部工作,找到问题将是相当具有挑战性的。我们需要更多的信息.​​..... – mrkb80 2013-05-07 17:33:25

回答

2

问题是计算列CUST_CD。经过大量研究,似乎BULK INSERT不喜欢复杂的计算类型(请参见Using SQL Server spatial types in SSIS data load)。解决方案是删除计算列,并使其成为varchar(20)NULL。然后我创建了一个新的执行SQL任务,用计算的值更新任何NULL行。