MISE À JOUR : modification du message pour inclure la solution la plus simple possible pour reproduire le problème.
J'ai du mal à utiliser le ScriptComponentProject dans BIML. J'utilise VS 2017 et la dernière version de BIML Express 2018.
J'essaie de créer un composant script qui récupère une description de l'erreur et le nom de la colonne incriminée en utilisant la stratégie décrite dans ce document. article de blog .
Il n'existe pas beaucoup d'exemples BIML pour le composant script mais ma solution est un mélange des éléments suivants Varigence Doc & un blog de Joost .
Lorsque je compile le BIML, il crée le paquet sans erreur ; cependant, lorsque j'ouvre le paquet, je reçois le message d'erreur :
"La valeur ne se situe pas dans la fourchette prévue".
Vous trouverez ci-dessous une version simplifiée du code qui est le strict minimum pour reproduire l'erreur. Il devrait être aussi simple que de copier le code dans un fichier .biml et de générer le paquet SSIS. L'échantillon lit à partir d'un fichier CSV à une colonne, convertit la colonne dans la source en un nombre entier. Les erreurs de conversion de données sont dirigées vers le composant script qui ajoute ensuite la colonne incriminée et les colonnes de description des erreurs au tampon de sortie, cette sortie est ensuite écrite vers une destination de fichier plat.
Toute aide serait grandement appréciée.
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<FlatFileConnection Name="Errors" FilePath="C:\Users\username\Desktop\BasicSSISErrors.csv" FileFormat="Errors" />
<FlatFileConnection Name="Source" FilePath="C:\Users\username\Desktop\BasicSSIS.csv" FileFormat="Source" />
</Connections>
<Packages>
<Package Name="PackageFromBIML" Language="None" ConstraintMode="LinearOnCompletion" ProtectionLevel="EncryptSensitiveWithUserKey">
<Tasks>
<Dataflow Name="Data Flow Task">
<Transformations>
<FlatFileSource Name="Flat File Source" LocaleId="None" FileNameColumnName="" ConnectionName="Source" />
<DataConversion Name="Data Conversion">
<DataflowOverrides>
<OutputPath OutputPathName="Output">
<Columns>
<Column ErrorRowDisposition="RedirectRow" TruncationRowDisposition="RedirectRow" ColumnName="Converted" />
</Columns>
</OutputPath>
</DataflowOverrides>
<Columns>
<Column SourceColumn="Integers" TargetColumn="Converted" DataType="SByte" />
</Columns>
</DataConversion>
<ScriptComponentTransformation Name="Script Component" ProjectCoreName="SC_a8f35334a2234702a5f92abdcbedb4e4">
<InputPath OutputPathName="Data Conversion.Error" />
<ScriptComponentProjectReference ScriptComponentProjectName="SC_a8f35334a2234702a5f92abdcbedb4e4" />
</ScriptComponentTransformation>
<FlatFileDestination Name="Flat File Destination" LocaleId="None" ConnectionName="Errors">
<Header></Header>
</FlatFileDestination>
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
<FileFormats>
<FlatFileFormat Name="Errors" CodePage="1252" TextQualifier="_x003C_none_x003E_" ColumnNamesInFirstDataRow="true" RowDelimiter="">
<Columns>
<Column Name="Integers" Length="50" DataType="AnsiString" Delimiter="Comma" MaximumWidth="50" />
<Column Name="ErrorCode" Delimiter="Comma" />
<Column Name="ErrorColumn" Delimiter="Comma" />
<Column Name="ErrorColumnName" DataType="AnsiString" Delimiter="Comma" />
<Column Name="ErrorDescription" DataType="AnsiString" Delimiter="CRLF" />
</Columns>
</FlatFileFormat>
<FlatFileFormat Name="Source" CodePage="1252" TextQualifier="_x003C_none_x003E_" ColumnNamesInFirstDataRow="true" RowDelimiter="">
<Columns>
<Column Name="Integers" Length="50" DataType="AnsiString" Delimiter="CRLF" MaximumWidth="50" />
</Columns>
</FlatFileFormat>
</FileFormats>
<ScriptProjects>
<ScriptComponentProject Name="SC_a8f35334a2234702a5f92abdcbedb4e4" ProjectCoreName="SC_a8f35334a2234702a5f92abdcbedb4e4.csproj">
<OutputBuffers>
<OutputBuffer Name="Output 0">
<Columns>
<Column Name="ErrorColumnName" Length="500" DataType="AnsiString" CodePage="1252" />
<Column Name="ErrorDescription" Length="500" DataType="AnsiString" CodePage="1252" />
</Columns>
</OutputBuffer>
</OutputBuffers>
<InputBuffer Name="Input 0">
<Columns>
<Column Name="ErrorCode" />
<Column Name="ErrorColumn" />
</Columns>
</InputBuffer>
<AssemblyReferences>
<AssemblyReference AssemblyPath="Microsoft.SqlServer.DTSPipelineWrap.dll" />
<AssemblyReference AssemblyPath="Microsoft.SqlServer.DTSRuntimeWrap.dll" />
<AssemblyReference AssemblyPath="Microsoft.SqlServer.PipelineHost.dll" />
<AssemblyReference AssemblyPath="Microsoft.SqlServer.TxScript.dll" />
<AssemblyReference AssemblyPath="System.dll" />
<AssemblyReference AssemblyPath="System.AddIn.dll" />
<AssemblyReference AssemblyPath="System.Data.dll" />
<AssemblyReference AssemblyPath="System.Xml.dll" />
</AssemblyReferences>
<Files>
<!-- Left alignment of .Net script to get a neat layout in package-->
<File Path="AssemblyInfo.cs">
using System.Reflection;
using System.Runtime.CompilerServices;
[assembly: AssemblyTitle("SC_a8f35334a2234702a5f92abdcbedb4e4.csproj")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SC_a8f35334a2234702a5f92abdcbedb4e4.csproj")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: AssemblyVersion("1.0.*")]
</File>
<File Path="main.cs">
using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public partial class ScriptMain : UserComponent
{
public override void Input0_ProcessInputRow(Input0Buffer Row)
{
Row.ErrorDescription = this.ComponentMetaData.GetErrorDescription(Row.ErrorCode);
IDTSComponentMetaData130 componentMetaData = this.ComponentMetaData as IDTSComponentMetaData130;
Row.ErrorColumnName = componentMetaData.GetIdentificationStringByID(Row.ErrorColumn);
}
}
</File>
</Files>
</ScriptComponentProject>
</ScriptProjects>
</Biml>