ОБНОВЛЕНИЕ: сообщение изменено, чтобы включить простейшее решение, позволяющее воспроизвести проблему.
Я борюсь с использованием ScriptComponentProject в BIML. Я использую последнюю версию VS 2017 и BIML Express 2018.
Я пытаюсь создать компонент скрипта, который будет извлекать описание ошибки и имя столбца-нарушителя, используя стратегию, изложенную в этом сообщение в блоге.
Не так много примеров BIML для компонента сценария, но мое решение представляет собой сочетание следующих Документ Varigence и блог от Joost а>.
Когда я компилирую BIML, он создает пакет без ошибок; однако, когда я открываю пакет, я получаю сообщение об ошибке:
"Значение не попадает в ожидаемый диапазон"
Ниже приведена урезанная версия кода, которая является минимальным для воспроизведения ошибки. Должно быть так же просто, как скопировать код в файл .biml и создать пакет SSIS. Образец считывает из CSV-файла с одним столбцом и преобразует столбец в источнике в целое число. Ошибки преобразования данных направляются компоненту скрипта, который затем добавляет столбец с ошибкой и столбцы с описанием ошибки в буфер вывода, после чего этот вывод записывается в целевой файл.
Любая помощь будет принята с благодарностью.
<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>