仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 706|回复: 7
打印 上一主题 下一主题

[学习教程] MSSQL教程之利用 SQL Server 时必要常常用到的几个...

[复制链接]
兰色精灵 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:38:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
EXAMPLE存储引擎是一个不做任何事情的存根引擎。它的目的是作为MySQL源代码中的一个例子,用来演示如何开始编写一个新存储引擎。同样,它的主要兴趣是对开发者。EXAMPLE存储引擎不支持编索引。server
1.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[database.[owner.]]{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服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用
莫相离 该用户已被删除
沙发
发表于 2015-1-19 20:21:22 | 只看该作者
varchar(max)\\\\nvarchar(max)类型的引入大大的提高了编程的效率,可以使用字符串函数对CLOB类型进行操作,这是一个亮点。
小女巫 该用户已被删除
板凳
发表于 2015-1-25 21:00:42 | 只看该作者
你觉得我的非分区索引无法对起子分区,你可以提醒我一下呀!没有任何的提醒,直接就变成了非分区表。不知道这算不算一个bug。大家也可以试试。
第二个灵魂 该用户已被删除
地板
发表于 2015-2-9 09:24:28 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
分手快乐 该用户已被删除
5#
发表于 2015-2-27 05:18:02 | 只看该作者
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
海妖 该用户已被删除
6#
发表于 2015-3-8 22:07:54 | 只看该作者
SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。
小魔女 该用户已被删除
7#
发表于 2015-3-16 15:47:29 | 只看该作者
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
乐观 该用户已被删除
8#
发表于 2015-3-22 23:29:57 | 只看该作者
需要注意的一点,也是我使用过程中发现的一个问题。在建立function->schema->table后,如果在现有的分区表上建立没有显式声明的聚集索引时,分区表会自动变为非分区表。这一点很让我纳闷。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 00:12

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表