我在SharePoint 2007(MOSS)中使用FullTextSqlQuery,需要按两列排序结果:
SELECT WorkId FROM SCOPE() ORDER BY Author ASC, Rank DESC
但是,在返回结果时,似乎只考虑了ORDER BY的第一列。在这种情况下,结果由作者正确排序,但不是由Rank排序。如果我更改了订单,结果将按Rank排序,但不会由作者订购。
我不得不依靠自己对结果进行排序,我不太喜欢。有没有人解决这个问题?
编辑:不幸的是,它也不接受ORDER BY子句中的表达式(SharePoint引发异常)。我的猜测是,即使查询看起来像是合法的SQL,它也会在被提供给SQL服务器之前以某种方式进行解析。
我试图用SQL Profiler捕获查询,但无济于事。
编辑2 :最后我使用单列排序(在我的情况下是作者,因为它是最重要的)并且在结果的TOP N上的代码中进行了第二次排序。对项目来说工作得足够好,但却留下了不好的代码感觉。
答案 0 :(得分:2)
Microsoft 最终发布了有关此问题的知识库文章。
“在SharePoint搜索查询的ORDER BY子句中使用RANK时,不应使用其他属性”
http://support.microsoft.com/kb/970830
症状:在SharePoint搜索查询的ORDER BY子句中使用RANK时,结果中仅使用第一个ORDER BY列。
原因:RANK是一个特殊属性,在全文索引中排名,因此不能与其他托管属性一起使用。
解决方案:不要将多个属性与RANK属性一起使用。
答案 1 :(得分:1)
Rank是MOSS FullTextSqlQuery中的一个特殊列,它为每个结果的排名提供数值。对于每个查询,该值将不同,并且 relative 与该特定查询的其他结果相同。因为这个等级应该对每个结果具有唯一值,并且按等级排序然后作者将与仅按等级排序相同。我会尝试在另一列而不是排名上进行排序,以查看结果是否按预期返回,如果是这样,您的麻烦可能与MOSS对结果排名的方式有关,每种独特查询都会有所不同。
你也是对的,查询看起来像SQL,但它不是实际传递给SQL服务器的查询,它是特殊的Microsoft Enterprise Search SQL Query语法。
答案 2 :(得分:1)
我也遇到了与FullTextSqlQuery和MOSS 2007相同的问题,其中只有多列“ORDER BY”中的第一列被尊重。
我在MSDN论坛中搜索了此主题,但未收到任何回复:
答案 3 :(得分:0)
我没有SharePoint的经验,但如果只有一个ORDER BY子句被尊重,我会将其更改为表达式而不是列。假设“Rank”是一个最大值为10的数字列,则以下内容可能有效:
SELECT WorkId FROM SCOPE() ORDER BY AUTHOR + (10 - Rank) ASC