在 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。
這快照隔離級別。
你最終會解決這個問題的。