如何将DT_R8存储在SSIS中的变量中

时间:2014-02-13 17:05:53

标签: sql-server ssis

我有一个SSIS包来从具有浮点数据类型的源表中读取数据。它在SSIS中显示为DT_R8(在外部列下),我想将值存储在SSIS包中的变量中,并且我使用Double数据类型,但它不起作用并抛出此错误...

  

赋给变量“User :: varDBVAL”的值的类型   与当前变量类型

不同

有人可以建议一个可能的解决方案,我只能找到SSIS和SQL Server之间的数据类型映射,但不能找到SSIS上的数据类型。

由于 约翰

4 个答案:

答案 0 :(得分:2)

我能做到这一点很好。我生成了一个包含2个执行sql任务的包:一个是POC Maverick的方式,另一个是我相信你正在做的事情。

enter image description here

如您所见,创建了4个变量:Mav,Query,QueryMav和varDBVAL。 Mav是一个整数,附加了一个表达式,赋值为零。这两个查询很简单 - 选择一个常量值以确保生成正确的类型。

我相信Maverick声明在变量上设置表达式允许您在任何地方覆盖该值。此屏幕截图显示的是,当第一个执行SQL任务触发时,错误输出时,@ [User :: Maverick]的值的覆盖实际上并没有。该任务为变量分配了值1,但该表达式会覆盖该值并提供0

enter image description here

float / double的执行SQL任务是直截了当的。我根据源查询返回单行数据

enter image description here

在变量选项卡中,我将第0列分配给变量@[User::varDBVAL],执行效果很好

enter image description here

Biml for reproduction

如果安装了BIDS Helper,如果编辑连接字符串以指向有效的SQL Server实例,则应该能够生成上述包并验证是否将float / double值赋值为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年,结果都是一样的。

enter image description here

如果显式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的默认解释将是数字(5,4)并且只显式地转换为浮点数据类型我实际上是否获得了浮点数。

enter image description here

2005/2008年可能有一种优雅的方式,但我只是将查询转储到表SELECT ... INTO dbo.Temporary WHERE NULL = NULL中,然后查看相应的元数据。

答案 1 :(得分:-1)

你可以做的一种方法是

1)点击变量User :: varDBVA&gt;转到变量属性并在表达式和评估值中拖动用户变量。

2)单击EvaluateAsExpression为TRUE

3)您可以在包中的任何位置分配此变量。

答案 2 :(得分:-1)

enter image description here

enter image description here

对不起我不是那个组织..希望这会有所帮助!!!

答案 3 :(得分:-2)

尝试使用以下步骤::

  1. 创建SSIS变量。 enter image description here

  2. 拖动执行SQL任务并进行如下配置。 enter image description here

  3. 如下地图参数。 enter image description here

  4. 现在通过在Post Execute上保留断点来执行包。检查该变量的值。如下。 enter image description here
  5. 让我知道你的意见/结果。