在 QueryBuilder 选项中使用 nolock 选项?是否有一个选项可以运行查询生成器,包括“with nolock”语句,以便在长时间数据提取期间不占用数据库? 将 QueryBuilder 生成的 SQL 复制到脚本窗口并添加“with nolock”会产生错误。
数据存取回复:在 QueryBuilder 选项中使用 nolock 选项?您似乎将“With(NOLOCK)”消息发送到 JMP,而不是数据库。确保它是您发送到数据库的 T-SQL 的一部分,如下所示:
Open Database(cnxn_string, "SELECT * FROM example WITH (NOLOCK)");

回复:在 QueryBuilder 选项中使用 nolock 选项?谢谢回复! 我附上了我的代码示例。 我不确定如何将 with (nolock) 发送到数据库而不是 JMP? JMP 不会传递输入到数据库的内容吗?
New SQL Query(
Version( 130 ),
Connection( "ODBC:DSN=<ENTERDSN>;PWD=<ENTERPASSWORD>" ),
QueryName( "testquery" ),
Select(
Column( "colname1", "t1" ),
Column( "colname2", "t1" ),
Column(
"colname3",
"t1",
Numeric Format( "m/d/y h:m:s", "0", "NO", "" )
),
Column( "colname4", "t1" )
),
From( Table( "table1", Schema( "dbname" ), Alias( "t1" ) ) ),
Where(
GE(
Column(
"colname3",
"t1",
Numeric Format( "m/d/y h:m:s", "0", "NO", "" )
),
3772915200,
UI( Comparison( Base( "Continuous" ) ) )
) & In List(
Column( "colname4", "t1" ),
{"col4val"},
UI( SelectListFilter( ListBox, Base( "Categorical" ) ) )
)
),
With( nolock )
) << Run; </ENTERPASSWORD></ENTERDSN>回复:在 QueryBuilder 选项中使用 nolock 选项?Connection( "ODBC:DSN=<ENTERDSN>;PWD=<ENTERPASSWORD>, With (nolock)" ),</ENTERPASSWORD></ENTERDSN>
当我在连接字符串中添加 with (nolock) 时,我仍然能够提取数据,但我不确定 with (nolock) 是否实际上阻止了表锁定。 想法?
回复:在 QueryBuilder 选项中使用 nolock 选项?我尝试了类似的方法,但它似乎没有将 NOLOCK 选项传递给 SQL Server。当我使用 New SQL Query() 时,我使用 CustomSQL,如下所示:
New SQL Query(
Connection( cnxn_string ),
QueryName( "Important Query" ),
CustomSQL( "SELECT * FROM example WITH (NOLOCK) WHERE [Column 2] > 1" )
) << Run;

我不确定是否有一种方法可以在不使用 New SQL Query() 中的 CustomSQL 或使用 Open Database() 函数的情况下发送 NOLOCK 选项。
*编辑*
如果您在当前的 New SQL Query() 上使用 <
回复:在 QueryBuilder 选项中使用 nolock 选项?我想我们已经快到了。 我在 CustomSQL 中尝试了您的建议,但出现以下错误:
运行 SQL 查询时出错:
[Microsoft][ODBC SQL Server 驱动程序][SQL Server]只能在 READ COMMITTED 或 REPEATABLE READ 隔离级别中指定 READPAST 锁。 [SQLSTATE = 42000]
有没有办法改变隔离级别以便可以使用 with (nolock) ?
或者 with (readpast) 是否完成了我需要的操作(确保在查询运行时生产不会被锁定,无法访问/修改表)?
回复:在 QueryBuilder 选项中使用 nolock 选项?您可以在整个 SQL 语句前面添加“SET TRANSACTION ISOLATION LEVEL READ COMMITTED”
或者
“设置事务级别可重复读取”
来自微软:(链接到页面)
已提交的读:
指定语句不能读取已被其他事务修改但未提交的数据。 这可以防止脏读。 数据可能会被当前事务中各个语句之间的其他事务更改,从而导致不可重复读取或幻像数据。 此选项是 SQL Server 默认选项。
可重复阅读:
指定语句无法读取其他事务已修改但尚未提交的数据,并且在当前事务完成之前,其他事务都无法修改当前事务已读取的数据。
所以WITH(NOLOCK)与READ UNCOMMITTED基本相同,但是没关系,因为WITH(NOLOCK)会覆盖READ COMMITTED或REPEATABLE READ。
New SQL Query(
Connection( cnxn_string ),
QueryName( "Important Query" ),
CustomSQL( "SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT * FROM test1.dbo.example WITH(NOLOCK)
WHERE [Column 2] > 0.5" )
) << Run;

回复:在 QueryBuilder 选项中使用 nolock 选项?我很感谢大家的持续回应。
“SET TRANSACTION LEVEL REPEATABLE READ”会引发语法错误。
“SET TRANSACTION ISOLATION LEVEL READ COMMITTED”不会引发语法错误。 但是,WITH(NOLOCK) 似乎不会覆盖 READ COMMITTED 或 REPEATABLE READ,因为我在日志中收到以下错误:运行 SQL 查询时出错:
[Microsoft][ODBC SQL Server 驱动程序][SQL Server]只能在 READ COMMITTED 或 REPEATABLE READ 隔离级别中指定 READPAST 锁。 [SQLSTATE = 42000]
我已经没有这个想法了。
回复:在 QueryBuilder 选项中使用 nolock 选项?也许您没有设置隔离级别的权限。你能运行以下 T-SQL 吗?
DBCC 用户选项
如果可以的话,它会告诉您默认的隔离级别,您可以决定是否需要 NOLOCK。

Microsoft 有关这些选项的更多信息这里。由于 NOLOCK 允许脏读(未提交到数据库并可能再次恢复或更改的更改),MS 建议如下:
您可以使用以下任一方法最大程度地减少锁定争用,同时保护事务免受未提交数据修改的脏读:
READ COMMITTED 隔离级别READ_COMMITTED_SNAPSHOT数据库选项设置为 ON。
这快照隔离级别。
你最终会解决这个问题的。