在 SSIS 数据源 T-SQL 中使用 WHERE ValX> ValY 时,结果包括 ValX = ValY 的列

Posted

技术标签:

【中文标题】在 SSIS 数据源 T-SQL 中使用 WHERE ValX> ValY 时,结果包括 ValX = ValY 的列【英文标题】:When using WHERE ValX> ValY in SSIS Data Source T-SQL , the result includes columns where ValX = ValY 【发布时间】:2016-08-14 07:07:16 【问题描述】:

我在使用 SSIS 时遇到了一个非常奇怪的问题(我也尝试过,只是通过在 SQL Server Management Studio 中编写查询,得到了相同的结果)。

我有一个查询应该显示某个值比上次增加的行。为此,我有 2 个表 - 旧表和新表,它们(如果我简单的话)包含 ID 和值(以及其他一些对这种情况不重要的列)。我在 ID 上加入这两个表并比较旧值和新值。两列(旧的和新的)都是浮动的(SSIS 将它们都视为 DT_R8)。

让我给你看一下查询的样子。

SELECT n.ID, n.Val, o.Val
FROM New as n INNER JOIN Old as o ON n.ID = o.ID
WHERE n.Val > o.Val

两个表中都有数千条记录,几乎所有记录都经过此查询,结果正确,但所有这些记录中有 3 条错误地出现在结果集中。这 3 个具有相等的 Old.Val 和 New.Val(值是:4803.2、1336.44、2883.25),但尽管它们不满足条件,但它们仍然出现在结果集中。让我还补充一点,这 3 条记录并不是唯一的记录,其中包含小数位的数字,还有更多记录,所有这些都很好。

我尝试了一些转换,但没有任何改变。

我还尝试了几种方法来从这些表中导出数据,以查看值是否实际上彼此不同,并且无论如何我这样做,这 6 个(3 个案例中的每个案例 2 对)数字总是出现平等。无论我如何导出数据,第二个小数点后都不会出现任何内容。

有没有人经历过类似的事情?我会非常感谢任何形式的建议。

【问题讨论】:

请在 WHERE 子句中将两列都转换为通用数据类型并进行检查。 (示例 WHERE CAST(n.Val AS MONEY) > CAST(o.Val AS MONEY) 哇,解决了这个问题!谢谢! 【参考方案1】:

请在 WHERE 子句中将两列都转换为通用数据类型并进行检查。 示例WHERE CAST(n.Val AS MONEY) > CAST(o.Val AS MONEY)

【讨论】:

像魅力一样工作!我可以问一下这是如何工作的吗?数字似乎仍然相同(视觉上),但现在比较可以正常工作。 @J.Kay,这可能对你有帮助,***.com/questions/8839460/…【参考方案2】:

尝试在比较表达式中将cast 浮点值转换为小数。

【讨论】:

以上是关于在 SSIS 数据源 T-SQL 中使用 WHERE ValX> ValY 时,结果包括 ValX = ValY 的列的主要内容,如果未能解决你的问题,请参考以下文章

从 T-SQL 运行 SSIS 包

要恢复的 SSIS 包

如何在 SSIS 控制流任务中创建一个临时表,然后在数据流任务中使用它?

如何在SSIS中的每一行中生成具有不同数据类型的固定宽度文件

SQLServer删除数据

列值更改的 T-SQL (SQL Server 2016) 触发器,在插入