MSSQL教程之利用 SQL Server 时必要常常用到的几个...
EXAMPLE存储引擎是一个不做任何事情的存根引擎。它的目的是作为MySQL源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE存储引擎不支持编索引。server1.SETDEADLOCK_PRIORITY
申明:把持在产生逝世锁情形时会话的反响体例。假如两个历程都锁定命据,而且直到别的历程开释本人的锁时,每一个历程才干开释本人的锁,即产生逝世锁情形。
语法:SETDEADLOCK_PRIORITY{LOW|NORMAL|@deadlock_var}
参数:LOW指定以后会话为首选逝世锁就义品。Microsoft®SQLServer™主动回滚逝世锁就义品的事件,并给客户端使用程序前往1205号逝世锁毛病信息。
NORMAL指定会话前往到默许的逝世锁处置办法。
@deadlock_var是指定逝世锁处置办法的字符变量。假如指定LOW,则@deadlock_var为3;假如指定NORMAL,则@deadlock_var为6。
正文:SETDEADLOCK_PRIORITY的设置是在实行或运转时设置,而不是在剖析时设置。
权限:SETDEADLOCK_PRIORITY权限默许授与一切用户。
2.SETLOCK_TIMEOUT
申明:指定语句守候锁开释的毫秒数。
语法:SETLOCK_TIMEOUTtimeout_period
参数:timeout_period是在Microsoft®SQLServer™前往锁定毛病前经由的毫秒数。值为-1(默许值)时暗示没有超时代限(即无穷期守候)。
当锁守候凌驾超时价时,将前往毛病。值为0时暗示基本不守候,而且一碰到锁就前往信息。
正文:在毗连入手下手时,该设置的值为-1。设置变动后,新设置在其他的毗连工夫里一向无效。
SETLOCK_TIMEOUT的设置是在实行或运转时设置,而不是在剖析时设置。
READPAST锁定提醒为该SET选项供应了另外一种体例。
权限:SETLOCK_TIMEOUT权限默许授与一切用户。
示例:下例将锁超时代限设置为1,800毫秒。
SETLOCK_TIMEOUT1800
GO
3.@@LOCK_TIMEOUT
申明:前往以后会话确当前锁超时设置,单元为毫秒。
语法:@@LOCK_TIMEOUT
前往范例:integer
正文:SETLOCK_TIMEOUT同意使用程序设置语句守候堵塞资本的最长工夫。当一条语句已守候凌驾LOCK_TIMEOUT所设置的工夫,则被锁住的语句将主动作废,并给使用程序前往一条毛病信息。
在一个毗连的入手下手,@@LOCK_TIMEOUT前往一个–1值。
示例:上面的示例显现当一个LOCK_TIMEOUT值未被设置时的了局集。
SELECT@@LOCK_TIMEOUT
上面是了局集:
----------------
-1
上面的示例设置LOCK_TIMEOUT为1800毫秒,然后挪用@@LOCK_TIMEOUT。
SETLOCK_TIMEOUT1800
SELECT@@LOCK_TIMEOUT
上面是了局集:
------------------------------
1800
4.SETIDENTITY_INSERT
申明:同意将显式值拔出表的标识列中。
语法:SETIDENTITY_INSERT]{table}{ON|OFF}
参数:database是指定的表所驻留的数据库称号。
owner是表一切者的称号。
table是含有标识列的表名。
正文:任什么时候候,会话中只要一个表的IDENTITY_INSERT属性能够设置为ON。假如某个表已将此属性设置为ON,而且为另外一个表收回了SETIDENTITY_INSERTON语句,则Microsoft®SQLServer™前往一个毛病信息,指出SETIDENTITY_INSERT已设置为ON并呈报此属性已设置为ON的表。
假如拔出值年夜于表确当前标识值,则SQLServer主动将新拔出值作为以后标识值利用。
SETIDENTITY_INSERT的设置是在实行或运转时设置,而不是在剖析时设置。
权限:实行权限默许授与sysadmin流动服务器脚色和db_owner及db_ddladmin流动数据库脚色和工具一切者。
示例:下例创立一个含有标识列的表,并显现怎样利用SETIDENTITY_INSERT设置添补由DELETE语句招致的标识值中的清闲。
--Createproductstable.
CREATETABLEproducts(idintIDENTITYPRIMARYKEY,productvarchar(40))
GO
--Insertingvaluesintoproductstable.
INSERTINTOproducts(product)VALUES(screwdriver)
INSERTINTOproducts(product)VALUES(hammer)
INSERTINTOproducts(product)VALUES(saw)
INSERTINTOproducts(product)VALUES(shovel)
GO
--Createagapintheidentityvalues.
DELETEproducts
WHEREproduct=saw
GO
SELECT*
FROMproducts
GO
--AttempttoinsertanexplicitIDvalueof3;
--shouldreturnawarning.
INSERTINTOproducts(id,product)VALUES(3,gardenshovel)
GO
--SETIDENTITY_INSERTtoON.
SETIDENTITY_INSERTproductsON
GO
--AttempttoinsertanexplicitIDvalueof3
INSERTINTOproducts(id,product)VALUES(3,gardenshovel)
GO
SELECT*
FROMproducts
GO
--Dropproductstable.
DROPTABLEproducts
GO
5.SETIMPLICIT_TRANSACTIONS
申明:为毗连设置隐性事件形式。
语法:SETIMPLICIT_TRANSACTIONS{ON|OFF}
正文:当设置为ON时,SETIMPLICIT_TRANSACTIONS将毗连设置为隐性事件形式。当设置为OFF时,则使毗连前往到主动提交事件形式。
当毗连是隐性事件形式且以后不在事件中时,实行以下语句将启动事件:
ALTERTABLEFETCHREVOKE
CREATEGRANTSELECT
DELETEINSERTTRUNCATETABLE
DROPOPENUPDATE
假如毗连已在翻开的事件中,则上述语句不启动新事件。
关于由于该设置为ON而主动翻开的事件,用户必需在该事件停止时将其显式提交或回滚。不然当用户断开毗连时,事件及其所包括的一切数据变动将回滚。在事件提交后,实行上述任一语句便可启动新事件。
隐性事件形式将坚持无效,直到毗连实行SETIMPLICIT_TRANSACTIONSOFF语句使毗连前往到主动提交形式。在主动提交形式下,假如各个语句乐成完成则提交。
在举行毗连时,SQLServerODBC驱动程序和用于SQLServer的MicrosoftOLEDB供应程序主动将IMPLICIT_TRANSACTIONS设置为OFF。对来自DB-Library使用程序的毗连,SETIMPLICIT_TRANSACTIONS默许为OFF。
当SETANSI_DEFAULTS为ON时,将启用SETIMPLICIT_TRANSACTIONS。
SETIMPLICIT_TRANSACTIONS的设置是在实行或运转时设置,而不是在剖析时设置。
示例:下例演示在将IMPLICIT_TRANSACTIONS设置为ON时显式或隐式启动事件。它利用@@TRANCOUNT函数演示翻开的事件和封闭的事件。
USEpubs
GO
CREATEtablet1(aint)
GO
INSERTINTOt1VALUES(1)
GO
PRINTUseexplicittransaction
BEGINTRAN
INSERTINTOt1VALUES(2)
SELECTTrancountintransaction=@@TRANCOUNT
COMMITTRAN
SELECTTrancountoutsidetransaction=@@TRANCOUNT
GO
PRINTSettingIMPLICIT_TRANSACTIONSON
GO
SETIMPLICIT_TRANSACTIONSON
GO
PRINTUseimplicittransactions
GO
--NoBEGINTRANneededhere.
INSERTINTOt1VALUES(4)
SELECTTrancountintransaction=@@TRANCOUNT
COMMITTRAN
SELECTTrancountoutsidetransaction=@@TRANCOUNT
GO
PRINTUseexplicittransactionswithIMPLICIT_TRANSACTIONSON
GO
BEGINTRAN
INSERTINTOt1VALUES(5)
SELECTTrancountintransaction=@@TRANCOUNT
COMMITTRAN
SELECTTrancountoutsidetransaction=@@TRANCOUNT
GO
SELECT*FROMt1
GO
--Needtocommitthistrantoo!
DROPTABLEt1
COMMITTRAN
GO
6.SETNOCOUNT
申明:使前往的了局中不包括有关受Transact-SQL语句影响的行数的信息。
语法:SETNOCOUNT{ON|OFF}
正文:当SETNOCOUNT为ON时,不前往计数(暗示受Transact-SQL语句影响的行数)。当SETNOCOUNT为OFF时,前往计数。
即便当SETNOCOUNT为ON时,也更新@@ROWCOUNT函数。
当SETNOCOUNT为ON时,将不给客户端发送存储过程当中的每一个语句的DONE_IN_PROC信息。当利用Microsoft®SQLServer™供应的有用工具实行查询时,在Transact-SQL语句(如SELECT、INSERT、UPDATE和DELETE)停止时将不会在查询了局中显现"nnrowsaffected"。
假如存储过程当中包括的一些语句其实不前往很多实践的数据,则该设置因为大批削减了收集流量,因而可明显进步功能。
SETNOCOUNT设置是在实行或运转时设置,而不是在剖析时设置。
权限:SETNOCOUNT权限默许授与一切用户。
示例:下例在osql有用工具或SQLServer查询剖析器中实行时,可避免显现有关受影响的行数的信息。
USEpubs
GO
--Displaythecountmessage.
SELECTau_lname
FROMauthors
GO
USEpubs
GO
--SETNOCOUNTtoONandnolongerdisplaythecountmessage.
SETNOCOUNTON
GO
SELECTau_lname
FROMauthors
GO
--ResetSETNOCOUNTtoOFF.
SETNOCOUNTOFF
GO
7.@@ROWCOUNT
申明:前往受上一语句影响的行数。
语法:@@ROWCOUNT
前往范例:integer
正文:任何不前往行的语句将这一变量设置为0,如IF语句。
示例:上面的示例实行UPDATE语句并用@@ROWCOUNT来检测是不是有产生变动的行。
UPDATEauthorsSETau_lname=Jones
WHEREau_id=999-888-7777
IF@@ROWCOUNT=0
printWarning:Norowswereupdated
8.SETROWCOUNT
申明:使Microsoft®SQLServer™在前往指定的行数以后中断处置查询。
语法:SETROWCOUNT{number|@number_var}
参数:number|@number_var是在中断给定查询之前要处置的行数(整数)。
正文:倡议将以后利用SETROWCOUNT的DELETE、INSERT和UPDATE语句从头编写为利用TOP语法。有关更多信息,请拜见DELETE、INSERT或UPDATE。
关于在远程表和当地及远程分区视图上实行的INSERT、UPDATE和DELETE语句,疏忽SETROWCOUNT选项设置。
若要封闭该选项(以便前往一切的行),请将SETROWCOUNT指定为0。
申明设置SETROWCOUNT选项将使年夜多半Transact-SQL语句在已受指定命目标行影响后中断处置。这包含触发器和INSERT、UPDATE及DELETE等数据修正语句。ROWCOUNT选项对静态游标有效,但限定键集的行集和不感知游标。利用该选项时应审慎,它次要与SELECT语句一同利用。
假如行数的值较小,则SETROWCOUNT替换SELECT语句TOP关头字。
SETROWCOUNT的设置是在实行或运转时设置,而不是在剖析时设置。
权限:SETROWCOUNT权限默许授与一切用户。
示例:SETROWCOUNT在指定的行数后中断处置。鄙人例中,注重有x行满意预支款少于或即是$5,000的前提;可是,从更新所前往的行数中能够看出并不是一切的行都失掉处置。ROWCOUNT影响一切的Transact-SQL语句。
USEpubs
GO
SELECTcount(*)ASCnt
FROMtitles
WHEREadvance>=5000
GO
上面是了局集:
Cnt
-----------
11
(1row(s)affected)
如今,将ROWCOUNT设置为4,并更新预支款即是或年夜于$5,000的一切行。
--SETROWCOUNTto4.
SETROWCOUNT4
GO
UPDATEtitles
SETadvance=5000
WHEREadvance>=5000
GO
9.SETTRANSACTIONISOLATIONLEVEL
申明:把持由毗连收回的一切Microsoft®SQLServer™SELECT语句的默许事件锁定举动。
语法:SETTRANSACTIONISOLATIONLEVEL
{READCOMMITTED
|READUNCOMMITTED
|REPEATABLEREAD
|SERIALIZABLE
}
参数:READCOMMITTED指定在读取数据时把持共享锁以免脏读,但数据可在事件停止前变动,从而发生不成反复读取或幻像数据。该选项是SQLServer的默许值。
READUNCOMMITTED实行脏读或0级断绝锁定,这暗示不收回共享锁,也不承受排它锁。当设置该选项时,能够对数据实行未提交读或脏读;在事件停止前能够变动数据内的数值,行也能够呈现在数据会合或从数据集消散。该选项的感化与在事件内一切语句中的一切表上设置NOLOCK不异。这是四个断绝级别中限定最小的级别。
REPEATABLEREAD锁定查询中利用的一切数据以避免其他用户更新数据,可是其他用户能够将新的幻像行拔出数据集,且幻像行包含在以后事件的后续读取中。由于并发低于默许断绝级别,以是应只在需要时才利用该选项。
SERIALIZABLE在数据集上安排一个局限锁,以避免其他用户在事件完成之前更新数据集或将行拔出数据集内。这是四个断绝级别中限定最年夜的级别。由于并发级别较低,以是应只在需要时才利用该选项。该选项的感化与在事件内一切SELECT语句中的一切表上设置HOLDLOCK不异。
正文:一次只能设置这些选项中的一个,并且设置的选项将一向对谁人毗连坚持无效,直到显式变动该选项为止。这是默许举动,除非在语句的FROM子句中在表级上指定优化选项。
SETTRANSACTIONISOLATIONLEVEL的设置是在实行或运转时设置,而不是在剖析时设置。
示例:下例为会话设置TRANSACTIONISOLATIONLEVEL。关于每一个后续Transact-SQL语句,SQLServer将一切共享锁一向把持到事件停止为止。
SETTRANSACTIONISOLATIONLEVELREPEATABLEREAD
GO
BEGINTRANSACTION
SELECT*FROMpublishers
SELECT*FROMauthors
...
COMMITTRANSACTION
10.SETXACT_ABORT
申明:指定当Transact-SQL语句发生运转时毛病时,Microsoft®SQLServer™是不是主动回滚以后事件。
语法:SETXACT_ABORT{ON|OFF}
正文:当SETXACT_ABORT为ON时,假如Transact-SQL语句发生运转时毛病,全部事件将停止并回滚。为OFF时,只回滚发生毛病的Transact-SQL语句,而事件将持续举行处置。编译毛病(如语法毛病)不受SETXACT_ABORT的影响。
关于年夜多半OLEDB供应程序(包含SQLServer),隐性或显式事件中的数据修正语句必需将XACT_ABORT设置为ON。独一不必要该选项的情形是供应程序撑持嵌套事件时。有关更多信息,请拜见散布式查询和散布式事件。
SETXACT_ABORT的设置是在实行或运转时设置,而不是在剖析时设置。
示例:下例招致在含有别的Transact-SQL语句的事件中产生违背外键毛病。在第一个语句会合发生毛病,但别的语句均乐成实行且事件乐成提交。在第二个语句会合,SETXACT_ABORT设置为ON。这招致语句毛病使批处置停止,并使事件回滚。
CREATETABLEt1(aintPRIMARYKEY)
CREATETABLEt2(aintREFERENCESt1(a))
GO
INSERTINTOt1VALUES(1)
INSERTINTOt1VALUES(3)
INSERTINTOt1VALUES(4)
INSERTINTOt1VALUES(6)
GO
SETXACT_ABORTOFF
GO
BEGINTRAN
INSERTINTOt2VALUES(1)
INSERTINTOt2VALUES(2)/*Foreignkeyerror*/
INSERTINTOt2VALUES(3)
COMMITTRAN
GO
SETXACT_ABORTON
GO
BEGINTRAN
INSERTINTOt2VALUES(4)
INSERTINTOt2VALUES(5)/*Foreignkeyerror*/
INSERTINTOt2VALUES(6)
COMMITTRAN
GO
/*Selectshowsonlykeys1and3added.
Key2insertfailedandwasrolledback,but
XACT_ABORTwasOFFandrestoftransaction
succeeded.
Key5inserterrorwithXACT_ABORTONcaused
allofthesecondtransactiontorollback.*/
SELECT*
FROMt2
GO
DROPTABLEt2
DROPTABLEt1
GO
Federated将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用 varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。 你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。 SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。 而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。 SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。 多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。 需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
页:
[1]