我能够很好地做到这一点。我生成了一个包含 2 个执行 sql 任务的包:一个是 POC Maverick 的方式,一个是我相信你正在做的事情。
如您所见,创建了 4 个变量:Mav、Query、QueryMav 和 varDBVAL。 Mav 是一个整数,附加了一个表达式,赋值为零。这两个查询非常简单 - 选择一个常量值以确保我们生成了正确的类型。
我相信 Maverick 是说在变量上设置表达式允许您在任何您希望的地方覆盖该值。此屏幕截图展示的是,虽然在第一个 Execute SQL Task 触发时它确实 not 出错,但 @[User::Maverick] 的值的覆盖实际上并没有坚持。该任务为变量分配了一个值1,但表达式覆盖了该值并提供了0
float/double 的执行 SQL 任务很简单。我根据我的源查询返回单行数据
在变量选项卡中,我将第零列分配给我的变量@[User::varDBVAL],然后执行就可以了
用于复制的 Biml
如果您安装了BIDS Helper,如果您编辑连接字符串以指向有效的 SQL Server 实例,您应该能够生成上述包并验证将浮点/双精度值分配到 SSIS 变量.
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
<Connections>
<OleDbConnection Name="CM_OLE" ConnectionString="Data Source=localhost\dev2012;Initial Catalog=tempdb;Provider=SQLNCLI10.1;Integrated Security=SSPI;"></OleDbConnection>
</Connections>
<Packages>
<Package Name="so_2176077" ConstraintMode="Linear">
<Variables>
<Variable DataType="Double" Name="varDBVAL">0</Variable>
<Variable DataType="String" Name="Query">SELECT CAST(1.0123 AS float) AS dbVal </Variable>
<Variable DataType="Int32" Name="Mav" EvaluateAsExpression="true">0</Variable>
<Variable DataType="String" Name="QueryMav">SELECT 1 AS Mav</Variable>
</Variables>
<Tasks>
<ExecuteSQL ConnectionName="CM_OLE" Name="SQL MavTest" ResultSet="SingleRow">
<VariableInput VariableName="User.QueryMav"></VariableInput>
<Results>
<Result VariableName="User.Mav" Name="0"></Result>
</Results>
</ExecuteSQL>
<ExecuteSQL ConnectionName="CM_OLE" Name="SQL AssignValue" ResultSet="SingleRow">
<VariableInput VariableName="User.Query"></VariableInput>
<Results>
<Result VariableName="User.varDBVAL" Name="0"></Result>
</Results>
</ExecuteSQL>
</Tasks>
</Package>
</Packages>
</Biml>
参考
编辑
无论我使用 2012 年还是 2008 年,结果都是一样的。
如果显式 CAST 有效,那么根本原因是您没有在浮点数上进行操作。它可能是一个十进制/数字,可以将错误消息解释为与浮点数不同的类型。
2012 年确定数据类型的方法是通过系统存储过程sys.sp_describe_first_result_set 或表值函数sys.dm_exec_describe_first_result_set。您可以在下面看到分配给带小数位数字的默认数据类型与显式类型转换之间的区别。
SELECT
T.name AS column_name
, T.column_ordinal
, T.system_type_name
FROM
sys.dm_exec_describe_first_result_set(N'SELECT 1.0123 AS Defaults, CAST(1.10123 AS float) AS Explicits;', NULL, NULL) AS T;
1.0123 的默认解释将是 numeric(5,4) 并且只有显式转换为浮点数据类型才能真正得到浮点数。
在 2005/2008 年可能有一种优雅的方式,但我只是将查询转储到表 SELECT ... INTO dbo.Temporary WHERE NULL = NULL 中,然后查看相应的元数据。