我在创建一个我似乎无法弄清楚的派生列时遇到问题。这是简单的SQL,但在SSIS中我似乎无法做到。
基本上它正在检查大于零的值,并指定字符串结果。结果也需要包裹在一个字符串中。
示例:
“指标= \”“+ [IND]> 0?”CP“:”“+”\“”
应该屈服:
如果IND是20.00,则指标=“CP” 要么 如果IND为0,则指示符=“”
我似乎无法将If / Then与字符串混合使用。有人有想法吗?
答案 0 :(得分:4)
你走在正确的轨道上。我相信你要找的表达是
(DT_STR,2,1252)((IND > 0) ? "CP" : "")
如果IND的值大于零,则使用字符串CP;否则使用空字符串。该表达式将放置在派生列任务中。
SSIS中的字符串操作将导致Unicode字符串DT_WSTR作为返回类型。因此,我将表达式的整个结果包装为显式转换为带有(DT_STR, 2, 1252)
调用的非unicode字符串类型。
如果NULL到达此表达式,则会在输出中导致NULL。这是否合适取决于你。如果不是,那么你需要测试它ISNULL([IND])
,然后让它采取任何理解CP或空字符串的路径。
我使用以下源查询创建了一个简单的包
SELECT 20.0 AS IND UNION ALL SELECT 0;
然后我将其输出输入到Derived Column中,该列使用上面定义的表达式,然后在其输出上放置一个数据查看器,以证明结果与期望值相匹配。
我的包裹的截屏
对于那些在家中随行的人,您可以通过以下方式构建此程序包
1.将Biml文件添加到您的SSIS项目(安装BIDS Helper之后)并将以下内容粘贴到生成的文件中(覆盖现有声明)。
2.编辑ConnectionString的值以指向有效的SQL Server安装。
3.右键单击Biml文件并生成SSIS包将导致名为so_20645240
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<!-- Change ConnectionString below. Privider if not 2012, Data Source for certain -->
<OleDbConnection
Name="Src"
ConnectionString="Data Source=localhost\dev2012;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;Auto Translate=False;"
/>
</Connections>
<Packages>
<Package Name="so_20645240" ConstraintMode="Linear">
<Variables>
<Variable Name="QuerySource" DataType="String">SELECT 20.0 AS IND UNION ALL SELECT 0; </Variable>
</Variables>
<Tasks>
<Dataflow Name="DFT Source">
<Transformations>
<OleDbSource Name="OLE_SRC Query" ConnectionName="Src"
>
<VariableInput VariableName="User.QuerySource" />
</OleDbSource>
<DerivedColumns Name="DER Expressions">
<Columns>
<Column Name="Indicator" DataType="String" Length="2">(DT_STR, 2, 1252)(([IND] > 0) ? "CP" : "")</Column>
</Columns>
</DerivedColumns>
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>