Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
SSIS Integration Runtime i Azure Data Factory
När din källdata är ordnad i ett icke-standardiserat format kan det vara mer bekvämt att konsolidera all din parsningslogik i ett enda skript än att kedja ihop flera Integration Services-transformationer för att uppnå samma resultat.
Exempel 1: Tolkning Row-Delimited poster
Exempel 2: Att dela upp föräldra- och barnposter
Anmärkning
Om du vill skapa en komponent som du enklare kan återanvända över flera Data Flow-uppgifter och flera paket, överväg att använda koden i detta Script-komponentexempel som utgångspunkt för en anpassad data flow-komponent. Mer information finns i Utveckla en komponent för anpassat dataflöde.
Exempel 1: Tolkning Row-Delimited poster
Detta exempel visar hur man tar en textfil där varje kolumn med data visas på en separat rad och parsar den till en destinationstabell med hjälp av Script-komponenten.
För mer information om hur man konfigurerar Script-komponenten för användning som en transformation i dataflödet, se Skapa en synkron transformation med skriptkomponenten och skapa en asynkron transformation med skriptkomponenten.
För att konfigurera detta exempel på skriptkomponent
Skapa och spara en textfil med namnet rowdelimiteddata.txt som innehåller följande källdata:
FirstName: Nancy LastName: Davolio Title: Sales Representative City: Seattle StateProvince: WA FirstName: Andrew LastName: Fuller Title: Vice President, Sales City: Tacoma StateProvince: WA FirstName: Steven LastName: Buchanan Title: Sales Manager City: London StateProvince:Öppna Management Studio och koppla upp dig mot en instans av SQL Server.
Välj en destinationsdatabas och öppna ett nytt frågefönster. I frågefönstret, kör följande skript för att skapa destinationstabellen:
create table RowDelimitedData ( FirstName varchar(32), LastName varchar(32), Title varchar(32), City varchar(32), StateProvince varchar(32) )Öppna SQL Server Data Tools och skapa ett nytt Integration Services-paket som heter ParseRowDelim.dtsx.
Lägg till en Flat File connection manager i paketet, döp det till RowDelimitedData och konfigurera det för att ansluta till den rowdelimiteddata.txt fil du skapade i ett tidigare steg.
Lägg till en OLE DB-anslutningshanterare i paketet och konfigurera det för att ansluta till instansen av SQL Server och databasen där du skapade destinationstabellen.
Lägg till en Data Flow-uppgift i paketet och klicka på fliken Data Flow i SSIS Designer.
Lägg till en Flat File Source till dataflödet och konfigurera den för att använda RowDelimitedData-anslutningshanteraren. På kolumnsidan i Flat File Source Editor, välj den enda tillgängliga externa kolumnen.
Lägg till en skriptkomponent i dataflödet och konfigurera den som en transformation. Koppla utdatan från Flat File Source till skriptkomponenten.
Dubbelklicka på Script-komponenten för att visa Script Transformation Editor.
På sidan Input Columns i Script Transformation Editor, välj den enda tillgängliga indatakolumnen.
På sidan Inputs and Outputs i Script Transformation Editor, välj Output 0 och ställ in dess SynchronousInputID till Ingen. Skapa 5 utdatakolumner, alla av typen sträng [DT_STR] med en längd på 32:
FirstName
Efternamn
Title
Ort
StateProvince
På Script-sidan i Script Transformation Editor, klicka på Redigera Script och ange koden som visas i ScriptMain-klassen i exemplet. Stäng skriptutvecklingsmiljön och skripttransformationsredigeraren.
Lägg till en SQL Server-destination i dataflödet. Konfigurera den för att använda OLE DB-anslutningshanteraren och tabellen RowDelimitedData. Koppla outputen från Script Component till denna destination.
Kör paketet. När paketet är färdigt, undersök posterna i SQL Server:s destinationstabell.
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
Dim columnName As String
Dim columnValue As String
' Check for an empty row.
If Row.Column0.Trim.Length > 0 Then
columnName = Row.Column0.Substring(0, Row.Column0.IndexOf(":"))
' Check for an empty value after the colon.
If Row.Column0.Substring(Row.Column0.IndexOf(":")).TrimEnd.Length > 1 Then
' Extract the column value from after the colon and space.
columnValue = Row.Column0.Substring(Row.Column0.IndexOf(":") + 2)
Select Case columnName
Case "FirstName"
' The FirstName value indicates a new record.
Me.Output0Buffer.AddRow()
Me.Output0Buffer.FirstName = columnValue
Case "LastName"
Me.Output0Buffer.LastName = columnValue
Case "Title"
Me.Output0Buffer.Title = columnValue
Case "City"
Me.Output0Buffer.City = columnValue
Case "StateProvince"
Me.Output0Buffer.StateProvince = columnValue
End Select
End If
End If
End Sub
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
string columnName;
string columnValue;
// Check for an empty row.
if (Row.Column0.Trim().Length > 0)
{
columnName = Row.Column0.Substring(0, Row.Column0.IndexOf(":"));
// Check for an empty value after the colon.
if (Row.Column0.Substring(Row.Column0.IndexOf(":")).TrimEnd().Length > 1)
// Extract the column value from after the colon and space.
{
columnValue = Row.Column0.Substring(Row.Column0.IndexOf(":") + 2);
switch (columnName)
{
case "FirstName":
// The FirstName value indicates a new record.
this.Output0Buffer.AddRow();
this.Output0Buffer.FirstName = columnValue;
break;
case "LastName":
this.Output0Buffer.LastName = columnValue;
break;
case "Title":
this.Output0Buffer.Title = columnValue;
break;
case "City":
this.Output0Buffer.City = columnValue;
break;
case "StateProvince":
this.Output0Buffer.StateProvince = columnValue;
break;
}
}
}
}
Exempel 2: Att dela upp föräldra- och barnposter
Detta exempel visar hur man tar en textfil, där en separatorrad föregår en rad för föräldraposter som följs av ett obestämt antal barnposterrader, och tolkar den till korrekt normaliserade föräldra- och barndestinationstabeller med hjälp av Script-komponenten. Detta enkla exempel kan enkelt anpassas för källfiler som använder mer än en rad eller kolumn för varje föräldra- och barnpost, så länge det finns något sätt att identifiera början och slutet på varje post.
Försiktighet
Detta exempel är avsett endast för demonstrationsändamål. Om du kör provet mer än en gång infogar den dubbletter nyckelvärden i destinationstabellen.
För mer information om hur man konfigurerar Script-komponenten för användning som en transformation i dataflödet, se Skapa en synkron transformation med skriptkomponenten och skapa en asynkron transformation med skriptkomponenten.
För att konfigurera detta exempel på skriptkomponent
Skapa och spara en textfil med namnet parentchilddata.txt som innehåller följande källdata:
********** PARENT 1 DATA child 1 data child 2 data child 3 data child 4 data ********** PARENT 2 DATA child 5 data child 6 data child 7 data child 8 data **********Öppna SQL Server Management Studio och anslut till en instans av SQL Server.
Välj en destinationsdatabas och öppna ett nytt frågefönster. I frågefönstret, kör följande skript för att skapa destinationstabellerna:
CREATE TABLE [dbo].[Parents]([ParentID] [int] NOT NULL, [ParentRecord] [varchar](32) NOT NULL, CONSTRAINT [PK_Parents] PRIMARY KEY CLUSTERED ([ParentID] ASC)) GO CREATE TABLE [dbo].[Children]([ChildID] [int] NOT NULL, [ParentID] [int] NOT NULL, [ChildRecord] [varchar](32) NOT NULL, CONSTRAINT [PK_Children] PRIMARY KEY CLUSTERED ([ChildID] ASC)) GO ALTER TABLE [dbo].[Children] ADD CONSTRAINT [FK_Children_Parents] FOREIGN KEY([ParentID]) REFERENCES [dbo].[Parents] ([ParentID])Öppna SQL Server Data Tools (SSDT) och skapa ett nytt Integration Services-paket som heter SplitParentChild.dtsx.
Lägg till en Flat File connection manager i paketet, döp det till ParentChildData och konfigurera det för att ansluta till den parentchilddata.txt fil som du skapade i ett tidigare steg.
Lägg till en OLE DB-anslutningshanterare i paketet och konfigurera den för att ansluta till instansen av SQL Server och databasen där du skapade destinationstabellerna.
Lägg till en Data Flow-uppgift i paketet och klicka på fliken Data Flow i SSIS Designer.
Lägg till en Flat File Source till dataflödet och konfigurera det för att använda ParentChildData-anslutningshanteraren. På kolumnsidan i Flat File Source Editor, välj den enda tillgängliga externa kolumnen.
Lägg till en skriptkomponent i dataflödet och konfigurera den som en transformation. Koppla utdatan från Flat File Source till skriptkomponenten.
Dubbelklicka på Script-komponenten för att visa Script Transformation Editor.
På sidan Input Columns i Script Transformation Editor, välj den enda tillgängliga indatakolumnen.
På sidan Inputs and Outputs i Script Transformation Editor, välj Output 0, byt namn på den till ParentRecords och ställ in dess SynchronousInputID till None. Skapa 2 utdatakolumner:
ParentID (primärnyckeln), av typen fyrbytes signerat heltal [DT_I4]
ParentRecord, av typen sträng [DT_STR] med längd 32.
Skapa en andra utdata och döp den till ChildRecords. SynchronousInputID för den nya utgången är redan satt till Ingen. Skapa 3 utdatakolumner:
ChildID (primärnyckeln), av typen fyrbytes signerat heltal [DT_I4]
ParentID (främmande nyckeln), även av typen fyrbytes signerat heltal [DT_I4]
ChildRecord, av typen sträng [DT_STR] med längd 50
På Skriptsidan i Script Transformation Editor, klicka på Redigera Skript. I ScriptMain-klassen , ange koden som visas i exemplet. Stäng skriptutvecklingsmiljön och skripttransformationsredigeraren.
Lägg till en SQL Server-destination i dataflödet. Koppla ParentRecords-utgången från Script-komponenten till denna destination. Konfigurera den att använda OLE DB-anslutningshanteraren och tabellen Föräldrar.
Lägg till en annan SQL Server Destination i dataflödet. Koppla ChildRecords-utgången från Script Component till denna destination. Konfigurera den för att använda OLE DB-anslutningshanteraren och tabellen Barn.
Kör paketet. När paketet är klart, undersök föräldra- och barnposterna i de två SQL Server-destinationstabellerna.
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
Static nextRowIsParent As Boolean = False
Static parentCounter As Integer = 0
Static childCounter As Integer = 0
' If current row starts with separator characters,
' then following row contains new parent record.
If Row.Column0.StartsWith("***") Then
nextRowIsParent = True
Else
If nextRowIsParent Then
' Current row contains parent record.
parentCounter += 1
Me.ParentRecordsBuffer.AddRow()
Me.ParentRecordsBuffer.ParentID = parentCounter
Me.ParentRecordsBuffer.ParentRecord = Row.Column0
nextRowIsParent = False
Else
' Current row contains child record.
childCounter += 1
Me.ChildRecordsBuffer.AddRow()
Me.ChildRecordsBuffer.ChildID = childCounter
Me.ChildRecordsBuffer.ParentID = parentCounter
Me.ChildRecordsBuffer.ChildRecord = Row.Column0
End If
End If
End Sub
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
int static_Input0_ProcessInputRow_childCounter = 0;
int static_Input0_ProcessInputRow_parentCounter = 0;
bool static_Input0_ProcessInputRow_nextRowIsParent = false;
// If current row starts with separator characters,
// then following row contains new parent record.
if (Row.Column0.StartsWith("***"))
{
static_Input0_ProcessInputRow_nextRowIsParent = true;
}
else
{
if (static_Input0_ProcessInputRow_nextRowIsParent)
{
// Current row contains parent record.
static_Input0_ProcessInputRow_parentCounter += 1;
this.ParentRecordsBuffer.AddRow();
this.ParentRecordsBuffer.ParentID = static_Input0_ProcessInputRow_parentCounter;
this.ParentRecordsBuffer.ParentRecord = Row.Column0;
static_Input0_ProcessInputRow_nextRowIsParent = false;
}
else
{
// Current row contains child record.
static_Input0_ProcessInputRow_childCounter += 1;
this.ChildRecordsBuffer.AddRow();
this.ChildRecordsBuffer.ChildID = static_Input0_ProcessInputRow_childCounter;
this.ChildRecordsBuffer.ParentID = static_Input0_ProcessInputRow_parentCounter;
this.ChildRecordsBuffer.ChildRecord = Row.Column0;
}
}
}