2013-03-07 8 views
8

Problemproblemy ze zrozumieniem sporadyczne niespójności podczas ładowania danych z pakietu SSIS

Podczas przekazany kilku miesięcy procedura poniżej opisane pracował bez najmniejszych problemów zdecydowana większość czasu to run (na 2008 R2). Mamy jednak trzy przypadki niepoprawnie połączonych danych. Pytanie brzmi: co powoduje to i jak mogę to naprawić?

DATA_PreImp 

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

Zwykle wygenerowana Powoduje to, że cecha jest połączony z Items_Main poprawnie, ale niekiedy (mniej niż 1%) porządek jest kodowany tak, że wartość col01 nie jest podłączony do tej samej Items_Main jako wartość pozostałe kolumny.

Wszelkie opinie na temat tego, co jest przyczyną tego są najbardziej cenne.

Dane procedurę

ruchome Mamy pakiet SSIS który przenosi dane z płaskim stole zwanego DATA_PreImp się do struktury składającej się z trzech odpowiednich tabelach (atrybutowego).

  • Items_Main powinien zawiera po jednym wierszu dla każdego rzędu w DATA_PreImp
  • Items_Featurevalues ​​zawiera jeden wiersz dla każdej wartości kolumnie rzędzie DATA_PreImp
  • Items_MainRel zawiera połączenie pomiędzy Items_Main i Items_FeatureValues ​​

The pierwszy krok w pakiecie SSIS wstawia dane z DATA_PreImp do Items_Main i wstawia wygenerowany identyfikator do kolumny TARGET_ID w pustej tabeli DATA_PreImpMappingTMP.

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

Drugi etap pakietu SSIS wypełnienia tabeli Items_MainRel z TARGET_ID (Itemid pierwotnie) oraz identyfikator funkcji (w tym przypadku 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; 

Trzeci etap polega na wypełnieniu kolumny SOURCE_ID w tabeli DATA_PreImpMapping2TMP z SOURCE_ID z DATA_PreImp.

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; 

Ostatnim krokiem jest wypełnienie tabeli Items_FeatureValues ​​danymi z DATA_PreImpMapping2TMP i 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 

struktura tabeli danych

Oto, co jest potrzebne, aby stworzyć scenariusz:

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

Dostaję klucz obcy przy drugim skrypcie. W dbo nie ma zapisu.Items_Features with featureID = 5 (jako zakodowany na stałe w tym skrypcie). Czy powinien to być inny identyfikator funkcji użyty w skrypcie, czy też brak rekordu w dbo.Items_Features? – Aphillippe

+0

Czy korzystasz z transakcji we wkładkach? Czy obsługa błędów w pakiecie SSIS rzuca jakieś użyteczne dane? Czy są inne procesy uruchomione na tych samych db/tabele w tym samym czasie, które mogą powodować problemy współbieżności? – Valkyrie

+1

z czymś tak złożonym, bez rzeczywistego pakietu i wszystkich wewnętrznych operacji, znalezienie problemu jest dość trudne. Potrzebujemy dużo więcej informacji ... – mrkb80

Odpowiedz

2

Problemem była obliczona kolumna CUST_CD. Po wielu badaniach wydaje się, że BULK INSERT nie lubi złożonych typów obliczeniowych (patrz Using SQL Server spatial types in SSIS data load). Rozwiązaniem jest usunięcie kolumny obliczeniowej i uczynienie jej varchar (20) NULL. Następnie utworzyłem nowe zadanie egzekucji SQL, które aktualizuje wszystkie wiersze NULL z wartością obliczoną.

Powiązane problemy