在使用SSIS脚本转换时,如何使用Contains()来评估InputBuffer行?

时间:2015-07-10 01:10:28

标签: c# ssis

我正在学习使用SSIS 2012脚本组件(C#)根据可能的条件列表转换值。

我已成功使用==运算符将输入行与开关块中的精确字符串值进行比较,但当我在if-else块中尝试 .Contains()方法时,所有行返回为 case else

我在下面展示了两个代码尝试。我正在使用 .Contains()方法并使用MSDN进行双重检查。它看起来好像我正在使用该方法。

我有理由可以进行精确的==运算符评估而不是 .Contains()评估吗?

import UIKit

class Website: UIViewController {

@IBOutlet var webViewWebsite: UIWebView!



override func viewDidLoad() {
    super.viewDidLoad()
    let requestURL = NSURL(string: "http://www.mindenefree.com")
    let request = NSURLRequest(URL: requestURL!)
    webViewWebsite.loadRequest(request)

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

为了提供更多上下文,此屏幕截图显示了我在 OLE DB目标任务之前放置脚本组件的位置。

The script component placed between the Data Conversion task and the OLE DB Destination task

1 个答案:

答案 0 :(得分:1)

来自引用的MSDN

  

返回一个值,该值指示指定的子字符串是否出现在此字符串中。

假设您的源数据包含以下值

  • 自由

.Contains(“FREE”)只会匹配第一个值,因为它会进行区分大小写的比较。

你在switch陈述中做了很多相同的事情 - 你已经为你遇到的各种外壳编码了。

您需要进行Case Insensitive比较 How can I do a case insensitive string comparison?

或者如果您已开始使用Contains方法,请确保两个参数都是适当的。

if (Row.MealCode.ToUpper().Contains("FREE".ToUpper()))

enter image description here

BIML

商业智能标记语言Biml是商业智能的平台。在这里,我们将用它来描述ETL。 BIDS Helper,是Visual Studio / BIDS / SSDT的免费补充,可改善开发体验。具体来说,我们将使用将描述ETL的Biml文件转换为SSIS包的能力。这样做的另一个好处是为您提供了一种机制,使您能够准确生成我正在描述的解决方案,而不是点击许多繁琐的对话框。

安装后,将新的Biml文件添加到SSIS项目并编辑第5行以指向有效的SQL Server实例。右键单击biml文件,然后选择Generate SSIS Package。

以下是使用Contains

生成带有预期逻辑的SSIS包所需的Biml示例
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
  <Connections>
    <Connection
        Name="tempdb"
        ConnectionString="Data Source=.\dev2008;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;"
            />
  </Connections>
  <Packages>
    <Package Name="so_31330881">
      <Tasks>
        <Dataflow Name="DFT Sample">
          <Transformations>
            <OleDbSource ConnectionName="tempdb" Name="OLESRC dbo_Source">
              <DirectInput>SELECT D.MealCode FROM (VALUES ('FREE'), ('free'), ('Free')) AS D(MealCode);</DirectInput>
            </OleDbSource>
            <ScriptComponentTransformation ProjectCoreName="SC_31330881" Name="SCR Transform values">
              <ScriptComponentProjectReference ScriptComponentProjectName="SC_31330881" />
            </ScriptComponentTransformation>
            <DerivedColumns Name="DER Placeholder" />
          </Transformations>
        </Dataflow>
      </Tasks>
    </Package>
  </Packages>

    <ScriptProjects>
        <ScriptComponentProject ProjectCoreName="SC_31330881" Name="SC_31330881">
    <Files>
        <File Path="main.cs">
using System;
using System.Data;
using System.Web.Services;
using System.Text;
using System.Xml;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
      // if (Row.MealCode.Contains("FREE"))
      if (Row.MealCode.ToUpper().Contains("FREE".ToUpper()))
      {
          Row.tMealCode = "Free";
      }
      else
      {
          Row.tMealCode = "Else";
      }      
    }
}
</File>
      <File Path="Properties\AssemblyInfo.cs">
        using System.Reflection;
        using System.Runtime.CompilerServices;

        //
        // General Information about an assembly is controlled through the following
        // set of attributes. Change these attribute values to modify the information
        // associated with an assembly.
        //
        [assembly: AssemblyTitle("SC_31330881")]
        [assembly: AssemblyDescription("")]
        [assembly: AssemblyConfiguration("")]
        [assembly: AssemblyCompany("")]
        [assembly: AssemblyProduct("SC_31330881")]
        [assembly: AssemblyCopyright("Copyright @  2014")]
        [assembly: AssemblyTrademark("")]
        [assembly: AssemblyCulture("")]
        //
        // Version information for an assembly consists of the following four values:
        //
        //      Major Version
        //      Minor Version
        //      Build Number
        //      Revision
        //
        // You can specify all the values or you can default the Revision and Build Numbers
        // by using the '*' as shown below:

        [assembly: AssemblyVersion("1.0.*")]
      </File>
    </Files>
    <AssemblyReferences>
      <AssemblyReference AssemblyPath="System" />
      <AssemblyReference AssemblyPath="System.Data" />
      <AssemblyReference AssemblyPath="System.Web.Services" />
      <AssemblyReference AssemblyPath="System.Windows.Forms" />
      <AssemblyReference AssemblyPath="System.Xml" />
      <AssemblyReference AssemblyPath="Microsoft.SqlServer.TxScript.dll" />
      <AssemblyReference AssemblyPath="Microsoft.SqlServer.DTSRuntimeWrap.dll" />
      <AssemblyReference AssemblyPath="Microsoft.SqlServer.DTSPipelineWrap.dll" />
      <AssemblyReference AssemblyPath="Microsoft.SqlServer.PipelineHost.dll" />
    </AssemblyReferences>
          <InputBuffer Name="Input 0">
            <Columns>
              <Column CodePage="1252" DataType="AnsiString" Length="10" Name="MealCode" UsageType="ReadOnly" />
            </Columns>
          </InputBuffer>
    <OutputBuffers>
      <OutputBuffer IsSynchronous="true" Name="Output 0">
        <Columns>
          <Column CodePage="1252" DataType="AnsiString" Length="10" Name="tMealCode" />
        </Columns>
      </OutputBuffer>
    </OutputBuffers>
  </ScriptComponentProject>
</ScriptProjects>
</Biml>