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

Posted

技术标签:

【中文标题】如何将 DT_R8 存储在 SSIS 中的变量中【英文标题】:How to store DT_R8 in a variable in SSIS 【发布时间】:2014-02-13 17:05:53 【问题描述】:

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

分配给变量“User::varDBVAL”的值的类型 与当前变量类型不同

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

谢谢 约翰

【问题讨论】:

执行sql任务还是在数据流中?使用 OLE DB 提供程序或 ADO.NET ? 【参考方案1】:

我能够很好地做到这一点。我生成了一个包含 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>

参考

Integration Services Data Types SQL Server Data Type Precedence

编辑

无论我使用 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 中,然后查看相应的元数据。

【讨论】:

再添加一个步骤,即要动态的变量- 单击变量> 转到属性> 表达式并拖动 User::Parametername.. 它现在应该粘住 @Maverick 我认为如果你能举一个简单的例子,它会改善你的答案。您可能有一些我从未见过的非常酷的技巧,但似乎 dotnetjohn 和我自己都没有理解您的方法的复杂性。 Maverick,blinkc 非常感谢你们俩的帮助。 CAST() 成功了。但是我从数据库中查询的值只是浮点类型。我仍然不明白为什么我必须将 FLOAT 数据类型转换为 FLOAT。非常感谢您告诉 abt BIDS Helper,我以前从不知道这一点。 我注意到,如果我使用 SQL 2012,TypeConversionMode 属性会为我解决问题,遗憾的是我仍在使用 2008 R2。它尝试将结果转换为它所映射到的变量的数据类型。最后我在这个问题上学到了很多... @billinkc:我只是想知道为什么我的答案有负分。我对有人降级我的答案并不生气,但我为这些人感到羞耻。【参考方案2】:

其中一种方法是

1) 点击变量 User::varDBVA > 转到变量属性并拖动表达式中的用户变量并评估值。

2) 点击 EvaluateAsExpression 为 TRUE

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

【讨论】:

你测试过这个吗? 嗨对不起,我没明白你的意思,我将执行 SQL 语句的输出(DT_R8)分配给 Double 变量 varDBVAL,但它抛出了我提到的错误。 也许我误解了你的方法@Maverick。当我创建一个执行 SQL 任务并将一个值分配给一个 EvaluateAsExpression 设置为 True 的变量时,该分配是有效的,但不会坚持,因为变量的值将是表达式,而不是你分配给它的任何值。 @billinkc :- 这是关于变量和表达式的美。假设您为一个变量分配了一个值,您可以在运行时动态更改它,或者您可以将其用作它.. @Maverick 我试过但仍然抛出错误。我的 SQL 任务的输出是 DT_R8 而不是表达式,所以我想知道 EvaluateAsExpression 将如何解决数据类型不匹配问题。【参考方案3】:

对不起,我不是那么有条理..希望这会有所帮助!!!

【讨论】:

由于这是您其他答案的一部分,因此最好将其编辑到该响应中,而不是作为单独的答案列出。也就是说,varDBVAL 是一个字符串数据类型,它包含 query 上的表达式。这如何解决将浮点数分配给 SSIS 变量的问题?【参考方案4】:

尝试以下步骤:

    创建 SSIS 变量。

    拖动执行 SQL 任务并进行如下配置。

    如下图参数。

    现在通过在 Post Execute 上保留断点来执行包。检查该变量的值。如下所示。

让我知道你的 cmets/结果。

【讨论】:

您的解决方案没有在您演示的内容中为 varDBVAL 分配值。相反,您将其用作查询的参数

以上是关于如何将 DT_R8 存储在 SSIS 中的变量中的主要内容,如果未能解决你的问题,请参考以下文章

如何将SSIS变量包含在平面文件目标中的标题行中

SSIS将日期时间变量与数据流中的varchar匹配

如何在 SSIS 包中使用变量和 SQL 代码?

如果存储过程失败,则在执行 SQL 任务中将输出变量值获取到 ssis 变量中

java变量存储问题

如何在 ssis 包中的变量中获取当前周星期一的日期