首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tSQLt AssertEqualsTable不检查排序

tSQLt AssertEqualsTable不检查排序
EN

Stack Overflow用户
提问于 2012-10-17 17:46:32
回答 1查看 976关注 0票数 1

我使用完全相同的模式为actual和expected定义了两个表。我将两行插入到预期的表中,I为2,1。

我跑步

代码语言:javascript
复制
INSERT INTO actual EXEC tSQLt.ResultSetFilter 1, '{statement}'

要填充实际的then

代码语言:javascript
复制
EXEC tSQLt.AssertEqualsTable @expected = 'expected' , @actual = 'actual'

来比较结果。

即使数据的顺序不同( is实际上是1,2),测试也会通过。

通过在测试中添加SELECT * FROM actual和SELECT * FROM expected并使用测试名称‘{ tSQLt.Run }’单独运行测试,我确认了数据是不同的。

有没有人知道这是不是已知的bug?显然,它应该检查每一行,因此应该检查排序。返回的所有其他列都为NULL,只有ID列包含一个值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-18 15:00:07

除非在select语句中指定了order by子句,否则SQL server不能保证排序(请参阅this MSDN page上的顶部项目符号)-尽管在实践中,排序通常是您所期望的。

正因为如此,我认为tSQLt查找不同和相同的行是有意义的,但是检查顺序就没有意义了,否则答案可能会随SQL server的突发奇想而改变,测试将毫无意义(更糟糕的是,间歇性地失败!)。tSQLt user guide on AssertEqualsTable声明它检查表的内容,但不是检查表中的顺序。是什么让你得出结论,订单也应该被检查?我找不到提到这件事的地方。

如果需要检查顺序,可以将预期结果和实际结果都插入到具有标识列的临时表中(或使用ROW_NUMBER)并检查结果表-如果顺序不同,则标识列也不同。

有一种类似的方法记录了here on Greg M Lucas' blog

不推荐使用不带order by子句的表返回的order (MSDN link) -因此我建议在应用程序对语句的调用中包含一个子句,或者如果返回行的顺序很重要,则在其中包含SP。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12931511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档