SQLServer中需要經常用到的幾個設定選項
1. SET DEADLOCK_PRIORITY
說明:控制在發生死鎖情況時會話的反應方式。如果兩個程式都鎖定資料,並且直到其它程式釋放自己的鎖時,每個程式才能釋放自己的鎖,即發生死鎖情況。
語法:SET DEADLOCK_PRIORITY { LOW | NORMAL | @deadlock_var }
引數:LOW指定當前會話為首選死鎖犧牲品。Microsoft® SQL Server™ 自動回滾死鎖犧牲品的事務,並給客戶端應用程式返回 1205 號死鎖錯誤資訊。
NORMAL指定會話返回到預設的死鎖處理方法。
@deadlock_var是指定死鎖處理方法的字元變數。如果指定 LOW,則 @deadlock_var 為 3;如果指定 NORMAL,則 @deadlock_var 為 6。
註釋:SET DEADLOCK_PRIORITY 的設定是在執行或執行時設定,而不是在分析時設定。
許可權:SET DEADLOCK_PRIORITY 許可權預設授予所有使用者。
2. SET LOCK_TIMEOUT
說明:指定語句等待鎖釋放的毫秒數。
語法:SET LOCK_TIMEOUT timeout_period
引數:timeout_period是在 Microsoft® SQL Server™ 返回鎖定錯誤前經過的毫秒數。值為 -1(預設值)時表示沒有超時期限(即無限期等待)。
當鎖等待超過超時值時,將返回錯誤。值為 0 時表示根本不等待,並且一遇到鎖就返回資訊。
註釋:在連線開始時,該設定的值為 -1。設定更改後,新設定在其餘的連線時間裡一直有效。
SET LOCK_TIMEOUT 的設定是在執行或執行時設定,而不是在分析時設定。
READPAST 鎖定提示為該 SET 選項提供了另一種方式。
許可權:SET LOCK_TIMEOUT 許可權預設授予所有使用者。
示例:下例將鎖超時期限設定為 1,800 毫秒。
SET LOCK_TIMEOUT 1800
GO
3. @@LOCK_TIMEOUT
說明:返回當前會話的當前鎖超時設定,單位為毫秒。
語法:@@LOCK_TIMEOUT
返回型別:integer
註釋:SET LOCK_TIMEOUT 允許應用程式設定語句等待阻塞資源的最長時間。當一條語句已等待超過 LOCK_TIMEOUT 所設定的時間,則被鎖住的語句將自動取消,並給應用程式返回一條錯誤資訊。
在一個連線的開始,@@LOCK_TIMEOUT 返回一個 –1值。
示例:下面的示例顯示當一個 LOCK_TIMEOUT 值未被設定時的結果集。
SELECT @@LOCK_TIMEOUT
下面是結果集:
----------------
-1
下面的示例設定 LOCK_TIMEOUT 為 1800 毫秒,然後呼叫 @@LOCK_TIMEOUT。
SET LOCK_TIMEOUT 1800
SELECT @@LOCK_TIMEOUT
下面是結果集:
------------------------------
1800
4. SET IDENTITY_INSERT
說明:允許將顯式值插入表的標識列中。
語法:SET IDENTITY_INSERT [ database.[ owner.] ] { table } { ON | OFF }
引數:database是指定的表所駐留的資料庫名稱。
owner是表所有者的名稱。
table是含有標識列的表名。
註釋:任何時候,會話中只有一個表的 IDENTITY_INSERT 屬性可以設定為 ON。如果某個表已將此屬性設定為 ON,並且為另一個表發出了 SET IDENTITY_INSERT ON 語句,則 Microsoft® SQL Server™ 返回一個錯誤資訊,指出 SET IDENTITY_INSERT 已設定為 ON 並報告此屬性已設定為 ON 的表。
如果插入值大於表的當前標識值,則 SQL Server 自動將新插入值作為當前標識值使用。
SET IDENTITY_INSERT 的設定是在執行或執行時設定,而不是在分析時設定。
許可權:執行許可權預設授予 sysadmin 固定伺服器角色和 db_owner 及 db_ddladmin 固定資料庫角色以及物件所有者。
示例:下例建立一個含有標識列的表,並顯示如何使用 SET IDENTITY_INSERT 設定填充由 DELETE 語句導致的標識值中的空隙。
-- Create products table.
CREATE TABLE products (id int IDENTITY PRIMARY KEY, product varchar(40))
GO
-- Inserting values into products table.
INSERT INTO products (product) VALUES ('screwdriver')
INSERT INTO products (product) VALUES ('hammer')
INSERT INTO products (product) VALUES ('saw')
INSERT INTO products (product) VALUES ('shovel')
GO
-- Create a gap in the identity values.
DELETE products
WHERE product = 'saw'
GO
SELECT *
FROM products
GO
-- Attempt to insert an explicit ID value of 3;
-- should return a warning.
INSERT INTO products (id, product) VALUES(3, 'garden shovel')
GO
-- SET IDENTITY_INSERT to ON.
SET IDENTITY_INSERT products ON
GO
-- Attempt to insert an explicit ID value of 3
INSERT INTO products (id, product) VALUES(3, 'garden shovel')
GO
SELECT *
FROM products
GO
-- Drop products table.
DROP TABLE products
GO
5. SET IMPLICIT_TRANSACTIONS
說明:為連線設定隱性事務模式。
語法:SET IMPLICIT_TRANSACTIONS { ON | OFF }
註釋:當設定為 ON 時,SET IMPLICIT_TRANSACTIONS 將連線設定為隱性事務模式。當設定為 OFF 時,則使連線返回到自動提交事務模式。
當連線是隱性事務模式且當前不在事務中時,執行下列語句將啟動事務:
ALTER TABLE FETCH REVOKE
CREATE GRANT SELECT
DELETE INSERT TRUNCATE TABLE
DROP OPEN UPDATE
如果連線已經在開啟的事務中,則上述語句不啟動新事務。
對於因為該設定為 ON 而自動開啟的事務,使用者必須在該事務結束時將其顯式提交或回滾。否則當使用者斷開連線時,事務及其所包含的所有資料更改將回滾。在事務提交後,執行上述任一語句即可啟動新事務。
隱性事務模式將保持有效,直到連線執行 SET IMPLICIT_TRANSACTIONS OFF 語句使連線返回到自動提交模式。在自動提交模式下,如果各個語句成功完成則提交。
在進行連線時,SQL Server ODBC 驅動程式和用於 SQL Server 的 Microsoft OLE DB 提供程式自動將 IMPLICIT_TRANSACTIONS 設定為 OFF。對來自 DB-Library 應用程式的連線,SET IMPLICIT_TRANSACTIONS 預設為 OFF。
當 SET ANSI_DEFAULTS 為 ON 時,將啟用 SET IMPLICIT_TRANSACTIONS。
SET IMPLICIT_TRANSACTIONS 的設定是在執行或執行時設定,而不是在分析時設定。
示例:下例演示在將 IMPLICIT_TRANSACTIONS 設定為 ON 時顯式或隱式啟動事務。它使用 @@TRANCOUNT 函式演示開啟的事務和關閉的事務。
USE pubs
GO
CREATE table t1 (a int)
GO
INSERT INTO t1 VALUES (1)
GO
PRINT 'Use explicit transaction'
BEGIN TRAN
INSERT INTO t1 VALUES (2)
SELECT 'Tran count in transaction'= @@TRANCOUNT
COMMIT TRAN
SELECT 'Tran count outside transaction'= @@TRANCOUNT
GO
PRINT 'Setting IMPLICIT_TRANSACTIONS ON'
GO
SET IMPLICIT_TRANSACTIONS ON
GO
PRINT 'Use implicit transactions'
GO
-- No BEGIN TRAN needed here.
INSERT INTO t1 VALUES (4)
SELECT 'Tran count in transaction'= @@TRANCOUNT
COMMIT TRAN
SELECT 'Tran count outside transaction'= @@TRANCOUNT
GO
PRINT 'Use explicit transactions with IMPLICIT_TRANSACTIONS ON'
GO
BEGIN TRAN
INSERT INTO t1 VALUES (5)
SELECT 'Tran count in transaction'= @@TRANCOUNT
COMMIT TRAN
SELECT 'Tran count outside transaction'= @@TRANCOUNT
GO
SELECT * FROM t1
GO
-- Need to commit this tran too!
DROP TABLE t1
COMMIT TRAN
GO
6. SET NOCOUNT
說明:使返回的結果中不包含有關受 Transact-SQL 語句影響的行數的資訊。
語法:SET NOCOUNT { ON | OFF }
註釋:當 SET NOCOUNT 為 ON 時,不返回計數(表示受 Transact-SQL 語句影響的行數)。當 SET NOCOUNT 為 OFF 時,返回計數。
即使當 SET NOCOUNT 為 ON 時,也更新 @@ROWCOUNT 函式。
當 SET NOCOUNT 為 ON 時,將不給客戶端傳送儲存過程中的每個語句的 DONE_IN_PROC 資訊。當使用 Microsoft® SQL Server™ 提供的實用工具執行查詢時,在 Transact-SQL 語句(如 SELECT、INSERT、UPDATE 和 DELETE)結束時將不會在查詢結果中顯示"nn rows affected"。
如果儲存過程中包含的一些語句並不返回許多實際的資料,則該設定由於大量減少了網路流量,因此可顯著提高效能。
SET NOCOUNT 設定是在執行或執行時設定,而不是在分析時設定。
許可權:SET NOCOUNT 許可權預設授予所有使用者。
示例:下例在 osql 實用工具或 SQL Server 查詢分析器中執行時,可防止顯示有關受影響的行數的資訊。
USE pubs
GO
-- Display the count message.
SELECT au_lname
FROM authors
GO
USE pubs
GO
-- SET NOCOUNT to ON and no longer display the count message.
SET NOCOUNT ON
GO
SELECT au_lname
FROM authors
GO
-- Reset SET NOCOUNT to OFF.
SET NOCOUNT OFF
GO
7. @@ROWCOUNT
說明:返回受上一語句影響的行數。
語法:@@ROWCOUNT
返回型別:integer
註釋:任何不返回行的語句將這一變數設定為 0 ,如 IF 語句。
示例:下面的示例執行 UPDATE 語句並用 @@ROWCOUNT 來檢測是否有發生更改的行。
UPDATE authors SET au_lname = 'Jones'
WHERE au_id = '999-888-7777'
IF @@ROWCOUNT = 0
print 'Warning: No rows were updated'
8. SET ROWCOUNT
說明:使 Microsoft® SQL Server™ 在返回指定的行數之後停止處理查詢。
語法:SET ROWCOUNT { number | @number_var }
引數:number | @number_var是在停止給定查詢之前要處理的行數(整數)。
註釋:建議將當前使用 SET ROWCOUNT 的 DELETE、INSERT 和 UPDATE 語句重新編寫為使用 TOP 語法。有關更多資訊,請參見 DELETE、INSERT 或 UPDATE。
對於在遠端表和本地及遠端分割槽檢視上執行的 INSERT、UPDATE 和 DELETE 語句,忽略 SET ROWCOUNT 選項設定。
若要關閉該選項(以便返回所有的行),請將 SET ROWCOUNT 指定為 0。
說明 設定 SET ROWCOUNT 選項將使大多數 Transact-SQL 語句在已受指定數目的行影響後停止處理。這包括觸發器和 INSERT、UPDATE 及 DELETE 等資料修改語句。ROWCOUNT 選項對動態遊標無效,但限制鍵集的行集和不感知遊標。使用該選項時應謹慎,它主要與 SELECT 語句一起使用。
如果行數的值較小,則 SET ROWCOUNT 替代 SELECT 語句 TOP 關鍵字。
SET ROWCOUNT 的設定是在執行或執行時設定,而不是在分析時設定。
許可權:SET ROWCOUNT 許可權預設授予所有使用者。
示例:SET ROWCOUNT 在指定的行數後停止處理。在下例中,注意有 x 行滿足預付款少於或等於 $5,000 的條件;但是,從更新所返回的行數中可以看出並非所有的行都得到處理。ROWCOUNT 影響所有的 Transact-SQL 語句。
USE pubs
GO
SELECT count(*) AS Cnt
FROM titles
WHERE advance >= 5000
GO
下面是結果集:
Cnt
-----------
11
(1 row(s) affected)
現在,將 ROWCOUNT 設定為 4,並更新預付款等於或大於 $5,000 的所有行。
-- SET ROWCOUNT to 4.
SET ROWCOUNT 4
GO
UPDATE titles
SET advance = 5000
WHERE advance >= 5000
GO
9. SET TRANSACTION ISOLATION LEVEL
說明:控制由連線發出的所有 Microsoft® SQL Server™ SELECT 語句的預設事務鎖定行為。
語法:SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE
}
引數:READ COMMITTED指定在讀取資料時控制共享鎖以避免髒讀,但資料可在事務結束前更改,從而產生不可重複讀取或幻像資料。該選項是 SQL Server 的預設值。
READ UNCOMMITTED執行髒讀或 0 級隔離鎖定,這表示不發出共享鎖,也不接受排它鎖。當設定該選項時,可以對資料執行未提交讀或髒讀;在事務結束前可以更改資料內的數值,行也可以出現在資料集中或從資料集消失。該選項的作用與在事務內所有語句中的所有表上設定 NOLOCK 相同。這是四個隔離級別中限制最小的級別。
REPEATABLE READ鎖定查詢中使用的所有資料以防止其他使用者更新資料,但是其他使用者可以將新的幻像行插入資料集,且幻像行包括在當前事務的後續讀取中。因為併發低於預設隔離級別,所以應只在必要時才使用該選項。
SERIALIZABLE在資料集上放置一個範圍鎖,以防止其他使用者在事務完成之前更新資料集或將行插入資料集內。這是四個隔離級別中限制最大的級別。因為併發級別較低,所以應只在必要時才使用該選項。該選項的作用與在事務內所有 SELECT 語句中的所有表上設定 HOLDLOCK 相同。
註釋:一次只能設定這些選項中的一個,而且設定的選項將一直對那個連線保持有效,直到顯式更改該選項為止。這是預設行為,除非在語句的 FROM 子句中在表級上指定最佳化選項。
SET TRANSACTION ISOLATION LEVEL 的設定是在執行或執行時設定,而不是在分析時設定。
示例:下例為會話設定 TRANSACTION ISOLATION LEVEL。對於每個後續 Transact-SQL 語句,SQL Server 將所有共享鎖一直控制到事務結束為止。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
BEGIN TRANSACTION
SELECT * FROM publishers
SELECT * FROM authors
...
COMMIT TRANSACTION
10. SET XACT_ABORT
說明:指定當 Transact-SQL 語句產生執行時錯誤時,Microsoft® SQL Server™ 是否自動回滾當前事務。
語法:SET XACT_ABORT { ON | OFF }
註釋:當 SET XACT_ABORT 為 ON 時,如果 Transact-SQL 語句產生執行時錯誤,整個事務將終止並回滾。為 OFF 時,只回滾產生錯誤的 Transact-SQL 語句,而事務將繼續進行處理。編譯錯誤(如語法錯誤)不受 SET XACT_ABORT 的影響。
對於大多數 OLE DB 提供程式(包括 SQL Server),隱性或顯式事務中的資料修改語句必須將 XACT_ABORT 設定為 ON。唯一不需要該選項的情況是提供程式支援巢狀事務時。有關更多資訊,請參見分散式查詢和分散式事務。
SET XACT_ABORT 的設定是在執行或執行時設定,而不是在分析時設定。
示例:下例導致在含有其它 Transact-SQL 語句的事務中發生違反外來鍵錯誤。在第一個語句集中產生錯誤,但其它語句均成功執行且事務成功提交。在第二個語句集中,SET XACT_ABORT 設定為 ON。這導致語句錯誤使批處理終止,並使事務回滾。
CREATE TABLE t1 (a int PRIMARY KEY)
CREATE TABLE t2 (a int REFERENCES t1(a))
GO
INSERT INTO t1 VALUES (1)
INSERT INTO t1 VALUES (3)
INSERT INTO t1 VALUES (4)
INSERT INTO t1 VALUES (6)
GO
SET XACT_ABORT OFF
GO
BEGIN TRAN
INSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) /* Foreign key error */
INSERT INTO t2 VALUES (3)
COMMIT TRAN
GO
SET XACT_ABORT ON
GO
BEGIN TRAN
INSERT INTO t2 VALUES (4)
INSERT INTO t2 VALUES (5) /* Foreign key error */
INSERT INTO t2 VALUES (6)
COMMIT TRAN
GO
/* Select shows only keys 1 and 3 added.
Key 2 insert failed and was rolled back, but
XACT_ABORT was OFF and rest of transaction
succeeded.
Key 5 insert error with XACT_ABORT ON caused
all of the second transaction to roll back. */
SELECT *
FROM t2
GO
DROP TABLE t2
DROP TABLE t1
GO
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/66009/viewspace-825190/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在jsavaScript中設定select的某個選項被選中JS
- React滑鼠點選事件物件中的幾個用到的屬性React事件物件
- vue中經常要用到的程式碼Vue
- 設定select下拉選單的預設選中項
- android 幾個經常用到的字串的擷取Android字串
- oracle經常使用到的hintOracle
- 開發中經常使用到的Xcode快捷鍵XCode
- 玩轉 Markdown,你需要用到這幾個工具
- jQuery設定select選中項程式碼例項jQuery
- 資料所有權設定中需要注意的事項
- 27個Asp.Net經常會用到的函式集ASP.NET函式
- 總結.NET程式設計中經常用到的27個函式程式設計函式
- SecureCRT的幾個用法設定Securecrt
- 影響mysqld安全的幾個選項(轉)MySql
- 【Python】開發過程中經常使用到的5種設計模式有哪些?Python設計模式
- 網站設計過程中需要遵循的幾個原則網站
- 經常提及的幾個js排序方法(氣泡排序、選擇排序、計數排序)JS排序
- Python面試中需要注意的幾點事項!Python面試
- 設計模式 | Spring中用到的設計模式,你知道幾個?設計模式Spring
- 直播平臺製作,日期選擇框設定只可以選中某幾個特定日期
- 在Windows中密碼設定的幾個要點(轉)Windows密碼
- 網路爬蟲設計中需要注意的幾個問題爬蟲
- awr報表中用到的幾個SQLSQL
- Authorization Value 用到的幾個字元:冒號字元
- ASP.NET網路程式設計中經常用到的27個函式集ASP.NET程式設計函式
- 選型招聘系統需要考慮的幾個要點
- 機器學習中的幾個常見概念(持續更新中......)機器學習
- Win10列印首選項如何設定_win10印表機首選項的設定步驟Win10
- dhtmlxGantt如何在DHTMLX Gantt中設定資源管理選項HTML
- 選中select下拉框項設定元素顏色
- XamarinEssentials教程設定首選項Preferences的值
- Vim auto-pairs設定選項AI
- PostCSS深入學習:設定選項CSS
- CRS需要的幾個packagePackage
- 開發中可能會用到的幾個 jQuery 小提示和技巧jQuery
- 寫技術類Blog需要注意的幾個事項
- 複製資料庫中需要注意的幾點事項資料庫
- Word2013中“自動套用格式”選項的設定方法