2017年8月9日 星期三

SQL Profiler 如何判斷資料正確的被新增


直接切入正題(因為好像找不到梗來說笑)

是這樣的,在我生命中有人曾提問:

發生資料無法正常寫入Log Table的情況,開啟Profiler錄製。

SQL Profiler看到SQL:BatchCompleted  RowCounts=1,Error=0.

但是資料沒新增到Log Table,也沒記錄到Exception
SQL Profiler判斷資料被正確的新增的方法。

假設你是從SQL Profiler使用openrowset,那會有Transaction ID,如果直接新增資料的話,並不會有交易。假設語法是加入SELECT XACT_STATE() AS A, @@TRANCOUNT AS B,結果回傳值都為1,表示有起交易,但資料並沒有新增進去,那表示資料可能被rollback
所以可以加入判斷,如果XACT_STATE()的回傳值為1的話,就commit這筆交易。當此選項設定為 1 時,SQL Server 就會允許特定存取。當此選項未設定或設定為 0 時,SQL Server 就不允許特定存取。

另外在語法上,設定 SET ROWCOUNT 選項會使大部分 Transact-SQL 陳述式在受到指定資料列數影響之後停止處理。其中包括觸發程序。ROWCOUNT 選項不會影響動態資料指標,但它會限制索引鍵集和非感應式資料指標之資料列集。在使用這個選項時應該要特別小心。進行單次指派的陳述式,一律會將 @@ROWCOUNT 值設為 1。它不會傳送任何資料列給用戶端。

設置SET ROWCOUNT選項將使大多數Transact-SQL語句在已受指定數目的行影響後停止處理。這包括觸發器和INSERTUPDATEDELETE等資料修改語句。ROWCOUNT選項對動態游標無效,但限制鍵集的行集和不感知游標。使用該選項時應謹慎,它主要與SELECT語句一起使用。 
如果行數的值較小,則SET ROWCOUNT替代SELECT語句TOP關鍵字。SET ROWCOUNT的設置是在執行或運行時設置,而不是在分析時設置。

另一個可能性的假設你的語法中,如果要拿某次的@@ROWCOUNT來判斷的話,只能判斷一次,如果要判斷多次的話,就要先把@@ROWCOUNT的值存到LOCAL變數,再去判斷這個LOCAL變數,才不會每RUN一個SQL,就會影響到@@ROWCOUNT的值。所以簡單的說它可能已經是預設在為1的情況下,但是可能你Log Table並沒有寫入任何的資料。



-
雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言