sql >> Database >  >> RDS >> Sqlserver

Hoe invoer- en uitvoerkolommen dynamisch in SSIS in kaart te brengen?

Als u een vergelijkbare tabel maakt, kunt u deze op 2 manieren gebruiken om kolommen dynamisch in het SSIS-pakket toe te wijzen, of u moet het hele pakket programmatisch bouwen. In dit antwoord zal ik proberen je wat inzichten te geven over hoe je dat kunt doen.

(1) Bron SQL-commando bouwen met aliassen

Opmerking:deze aanpak werkt alleen als alle .dbf-bestanden hetzelfde aantal kolommen hebben, maar de namen verschillen

In deze benadering genereert u het SQL-commando dat als bron wordt gebruikt op basis van de FileID en de door u gemaakte toewijzingstabel. U moet weten dat de FileID en het .dbf-bestandspad zijn opgeslagen in een variabele. als voorbeeld:

Ervan uitgaande dat de tabelnaam inputoutputMapping is

Voeg een Execute SQL Task toe met het volgende commando:

DECLARE @strQuery as VARCHAR(4000)

SET @strQuery = 'SELECT '

SELECT @strQuery = @strQuery + '[' + InputColumn + '] as [' + OutputColumn + '],'
FROM inputoutputMapping
WHERE FileID = ?

SET @strQuery = SUBSTRING(@strQuery,1,LEN(@strQuery) - 1) + ' FROM ' + CAST(? as Varchar(500))

SELECT @strQuery

En selecteer in het tabblad Parametertoewijzing de variabele die de FileID bevat die moet worden toegewezen aan de parameter 0 en de variabele die de .dbf-bestandsnaam (alternatief voor tabelnaam) bevat voor de parameter 1

Stel het ResultSet-type in op Single Row en sla de ResultSet 0 . op binnen een variabele van het type string als voorbeeld @[User::SourceQuery]

De ResultSet-waarde is als volgt:

SELECT [CustCd] as [CustCode],[CNAME] as [CustName],[Address] as [CustAdd] FROM database1

In de OLEDB Source selecteer de Table Access Mode to SQL Command van Variable en gebruik @[User::SourceQuery] variabele als bron.

(2) Een scriptcomponent als bron gebruiken

Bij deze benadering moet u een scriptcomponent als bron gebruiken binnen de gegevensstroomtaak:

Allereerst moet u het .dbf-bestandspad en de SQL Server-verbinding via variabelen doorgeven aan de scriptcomponent als u ze niet hard wilt coderen.

In de scripteditor moet u een uitvoerkolom toevoegen voor elke kolom in de bestemmingstabel en deze toewijzen aan de bestemming .

In het script moet u het .dbf-bestand in een gegevenstabel lezen:

  • C# Lezen van .DBF-bestanden naar een gegevenstabel
  • Een DBF in een gegevenstabel laden

Nadat u de gegevens in een gegevenstabel hebt geladen, vult u ook een andere gegevenstabel in met de gegevens die u vindt in de MappingTable die u in SQL Server hebt gemaakt.

Loop daarna over de kolommen met gegevenstabel en wijzig de .ColumnName naar de relevante uitvoerkolom, als voorbeeld:

foreach (DataColumn col in myTable.Columns)
    {

    col.ColumnName = MappingTable.AsEnumerable().Where(x => x.FileID = 1 && x.InputColumn = col.ColumnName).Select(y => y.OutputColumn).First(); 

    }

Loop na over elke rij in de gegevenstabel en maak een scriptuitvoerrij.

Houd er bovendien rekening mee dat u bij het toewijzen van uitvoerrijen moet controleren of de kolom bestaat, u kunt eerst alle kolomnamen toevoegen aan de lijst met tekenreeksen en deze vervolgens gebruiken om te controleren, bijvoorbeeld:

var columnNames = myTable.Columns.Cast<DataColumn>()
                             .Select(x => x.ColumnName)
                             .ToList();  


foreach (DataColumn row in myTable.Rows){

if(columnNames.contains("CustCode"){

    OutputBuffer0.CustCode = row("CustCode");

}else{

    OutputBuffer0.CustCode_IsNull = True

}

//continue checking all other columns

}

Als je meer details nodig hebt over het gebruik van een Script Component als bron, check dan een van de volgende links:

  • SSIS-scriptcomponent als bron
  • Een bron maken met de scriptcomponent
  • Scriptcomponent als bron – SSIS
  • SSIS – EEN SCRIPT-COMPONENT ALS BRON GEBRUIKEN

(3) Het pakket dynamisch opbouwen

Ik denk niet dat er andere methoden zijn die je kunt gebruiken om dit doel te bereiken, behalve dat je de keuze hebt om het pakket dynamisch te bouwen, dan zou je moeten gaan met:

  • BIML
  • Integration Services beheerd objectmodel
  • EzApi-bibliotheek

(4) SchemaMapper:C# schema mapping klassenbibliotheek

Onlangs ben ik een nieuw project begonnen op Git-Hub, een klassenbibliotheek die is ontwikkeld met C#. U kunt het gebruiken om tabelgegevens van Excel, Word, Powerpoint, Text, CSV, html, json en xml in de SQL-servertabel te importeren met een andere schemadefinitie met behulp van schematoewijzing. bekijk het op:

  • SchemaMapper:C# Schema mapping klassenbibliotheek

Je kunt deze Wiki-pagina volgen voor een stapsgewijze handleiding:

  • Importeer gegevens uit meerdere bestanden in één SQL-tabel, stapsgewijze handleiding



  1. Hoe kan ik het aantal rijen tellen dat een MySQL-query heeft geretourneerd?

  2. Fix "Kan niet installeren in Homebrew op ARM-processor in Intel standaard prefix (/usr/local)!"

  3. SQL:selecteer records waarbij ALLE samengevoegde records aan een bepaalde voorwaarde voldoen

  4. Installeer Oracle Instant-client in Docker-container voor Python cx_Oracle