使用WITH(NOLOCK)和FREETEXTTABLE

时间:2015-02-25 03:18:06

标签: sql-server

我对如何使用WITH (NOLOCK)以及全文搜索感到困惑。

SQL Server NOLOCK and joins我得到了一个重要信息,我们应该在SQL连接的每个表中使用WITH (NOLOCK)。但是,它不适用于此查询:

SELECT * 
FROM myTable AS FT_TBL WITH (NOLOCK)
FULL OUTER JOIN
    FREETEXTTABLE (myTable, fieldName,  'SRI') AS KEY_TBL WITH (NOLOCK)
ON FT_TBL.id = KEY_TBL.[KEY]

错误消息是:

  

Msg 156,Level 15,State 1,Line 7
  关键字“WITH”附近的语法不正确。
  消息319,级别15,状态1,行7   关键字'with'附近的语法不正确。如果此语句是公用表表达式,xmlnamespaces子句或更改跟踪上下文子句,则必须以分号结束前一个语句。'

问题在于'AS KEY_TBL WITH(NOLOCK)',因为它没有'WITH(NOLOCK)'就可以了。我该怎么办?我希望每个类似的记录都出现在搜索结果中,尽管其他人更新了这些记录。请提前帮助和谢谢。

1 个答案:

答案 0 :(得分:0)

FREETEXTTABLE不支持表提示。如果您希望在整个过程中进行未提交的读取(这是NOLOCK对单个表的实现),请在T-SQL中设置事务隔离级别:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SELECT * 
FROM myTable AS FT_TBL
FULL OUTER JOIN
    FREETEXTTABLE (myTable, fieldName,  'SRI') AS KEY_TBL
ON FT_TBL.id = KEY_TBL.[KEY]

或使用IsolationLevel.ReadUncommitted在您的客户端代码中。

但是你应该充分意识到这种后果:READ UNCOMMITTED确实会发出更少的锁,但它可以回馈不一致的结果。如果你所追求的只是不阻塞的读取,那么探索的一个有价值的替代方法是snapshot isolationREAD_COMMITTED_SNAPSHOT数据库选项。 NOLOCK以及替代方案的问题被雄辩地总结为in this article