我是SSIS的新手,我正在编写一个将CSV转储到表中的应用程序。该表已经存在,它使用位字段作为布尔值。有趣的是,在这个领域,我可以手动插入0,1,true或false。当我查询表时,即使我插入0或1,它也会给我真或假。
现在,当我尝试使用SSIS输入真或假时,我收到错误。如果我将传入字段设置为布尔值,我就会立即收到错误消息。如果我将类型设置为字符串,我在运行时会收到错误。我也试过从字符串转换为bool或int无效。
有什么想法吗?
谢谢, 埃里克
答案 0 :(得分:4)
数据流或表达式语言适用于1/0或true / false。但是,当它尝试将布尔值序列化为文本以用于平面文件时,它会将其保存为“true”或“false”。不要问我为什么,我只知道我通过派生列显式地将它们转换为1或0的字符或整数。否则,您最终会遇到截断错误。
在我的数据源中,CarOwner是一种数据类型。在我的派生列中,我将添加一个名为OwnsCar的新列,并使用以下表达式。
CarOwner ? 1 : 0
以下Biml描述了我构建的包。如果您可以免费下载BIDS Helper,则可以将其粘贴到新的Biml文件中,修复以下连接的值(localhost\dev2012
,路径c:\ssisdata
可能对您无效环境)它将发出一个SSIS包。
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<OleDbConnection
ConnectionString="Provider=SQLOLEDB;Data Source=localhost\dev2012;Integrated Security=SSPI;Initial Catalog=tempdb"
Name="SRCDB" />
<FlatFileConnection FilePath="C:\ssisdata\so_31146110" FileFormat="FFF Simple" Name="FF_Boolean" />
</Connections>
<FileFormats>
<FlatFileFormat
IsUnicode="false"
FlatFileType="Delimited"
Name="FFF Simple">
<Columns>
<Column Name="CustomerName" DataType="String" Length="20" Delimiter="Tab" />
<Column Name="OwnsCar" DataType="Int32" Delimiter="Tab" />
<Column Name="OwnsTruck" DataType="Int32" Delimiter="CRLF" />
</Columns>
</FlatFileFormat>
</FileFormats>
<Packages>
<Package ConstraintMode="Linear" Name="BooleanFlatFile">
<Variables>
<Variable Name="QuerySource" DataType="String">
<![CDATA[SELECT
'Customer ' + CAST(ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS varchar(2)) AS CustomerName
, *
FROM
(
VALUES
(CAST(1 AS bit))
, (CAST(1 AS bit))
, (CAST(0 AS bit))
) S(CarOwner)
CROSS APPLY
(
VALUES
(CAST(1 AS bit))
, (CAST(0 AS bit))
, (CAST(0 AS bit))
, (CAST(0 AS bit))
, (CAST(0 AS bit))
, (CAST(0 AS bit))
) F(TruckOwner);
]]></Variable>
</Variables>
<Tasks>
<Dataflow Name="DFT FF_Boolean">
<Transformations>
<OleDbSource
ConnectionName="SRCDB"
Name="OLESRC Unpivot Source">
<VariableInput VariableName="User.QuerySource" />
</OleDbSource>
<DerivedColumns Name="DER Booleans to ints">
<Columns>
<Column DataType="Int32" Name="OwnsCar" >CarOwner ? 1 : 0</Column>
<Column DataType="Int32" Name="OwnsTruck" >TruckOwner ? 1 : 0</Column>
</Columns>
</DerivedColumns>
<FlatFileDestination ConnectionName="FF_Boolean" Name="FFDST FF_Boolean"></FlatFileDestination>
</Transformations>
</Dataflow>
</Tasks>
</Package>
</Packages>
</Biml>
答案 1 :(得分:0)
我找到了答案。 我已将字段作为字符串导入,然后使用以下公式将变量创建为派生列: (DT_BOOL)(UPPER(RTRIM(ABC))==&#34; TRUE&#34;?1:0)