我正在学习使用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目标任务之前放置脚本组件的位置。
答案 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()))
商业智能标记语言Biml是商业智能的平台。在这里,我们将用它来描述ETL。 BIDS Helper,是Visual Studio / BIDS / SSDT的免费补充,可改善开发体验。具体来说,我们将使用将描述ETL的Biml文件转换为SSIS包的能力。这样做的另一个好处是为您提供了一种机制,使您能够准确生成我正在描述的解决方案,而不是点击许多繁琐的对话框。
安装后,将新的Biml文件添加到SSIS项目并编辑第5行以指向有效的SQL Server实例。右键单击biml文件,然后选择Generate SSIS Package。
以下是使用Contains
<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>