我们正在为ASP.NET应用程序编写针对测试SQL Server数据库运行的单元测试。也就是说,ClassInitialize方法使用测试数据创建一个新数据库,ClassCleanup删除该数据库。我们通过从代码运行.bat脚本来完成此操作。
被测类被赋予一个连接字符串,该字符串连接到单元测试数据库而不是生产数据库。
我们的问题是,数据库包含一个全文索引,为了让我们的测试按预期运行,需要用测试数据完全填充该索引。
据我所知,全文索引总是在后台填充。我希望能够:
1.使用同步(transact-SQL?)语句创建完全填充的全文索引,或者
1.了解全文填充何时完成,是否有回调选项,或者我可以重复询问吗?
我目前的解决方案是在类初始化方法结束时强制延迟- 5秒似乎有效-因为我在文档中找不到任何东西。
7条答案
按热度按时间vzgqcmou1#
对于"丹尼尔·伦肖"的回答,我想提供一个更容易阅读的版本:
结果:
kmbjn2e32#
您可以使用FULLTEXTCATALOGPROPERTY查询状态(请参见此处:http://technet.microsoft.com/en-us/library/ms190370.aspx)。
例如:
您可能还想使用SQL事件探查器来监视在您打开目录的属性对话框时SQL Server Management Studio发出的命令。该对话框包括填充状态的指示,并且显示的所有信息都是使用T-SQL查询的。
mmvthczy3#
这是我们根据GarethOwen的答案创建的一个存储过程。它接受逗号分隔的表列表作为参数,并等待所有表的全文索引更新。它每十分之一秒进行一次检查,以防止磁盘颠簸,并在10秒后超时,以防运行缓慢或损坏。如果FT搜索跨越多个索引,则非常有用。
按以下方式调用:
来源:
split是一个表值函数,现在每个人都必须拥有它,它将分隔符上的字符串拆分到临时表中:
ugmeyewa4#
谢谢丹尼尔,你的回答让我走上了正确的轨道。
我实际上使用下面的T-SQL语句来询问全文索引的填充状态是否为Idle:
'v_doc_desc_de'是我们索引的数据库视图的名称。
如果填充状态不是Idle,我将等待几秒钟,然后再次询问,直到填充状态变为Idle。在两次检查之间等待一小段时间以确保全文填充不会因持续检查填充状态而减慢速度,这一点很重要。
MSDN documentation声明建议使用
OBJECTPROPERTYEX
函数(表级),而不是使用属性为“PopulateStatus”的FULLTEXTCATALOGPROPERTY
语句。它声明如下:SQL Server的未来版本中将删除以下属性:避免在新的开发工作中使用这些属性,并计划修改当前使用其中任何属性的应用程序。
vbopmzt15#
要等待全文目录完成其所有表和视图的填充而不必指定它们的名称,可以使用以下存储过程。这是JohnB对此问题的回答和cezarm对related question的回答的组合:
kokeuurv6#
我做了以下工作:
zrfyljdw7#
我在使用一个带有全文搜索的dockerized sql server时也遇到了同样的问题,数据库成功地植入了种子,但是当我运行测试时,索引填充状态还没有完成,所以在我的测试中没有返回结果。
为了确保在运行测试之前重建索引,我使用了一个自旋锁和一个查询,该查询识别我的表中是否有正在重建的索引: