²L½Í SQL Server 2005 T-SQL·s¥\¯à

¹Ï®Ñ¸ê°TÀ]/¸³«Ø¥°


1 «´¤l

Transact Structure Query Language(T-SQL) µ²ºc¤Æ¬d¸ß»y¨¥¬O»P SQL Server ·¾³qªº°ò¦¡A¤@¤Áªº«ü¥O¹ï¸ê®Æ®w¤ÞÀº¦Ó¨¥³Ì²×³£­n¥H T-SQL §e ²{¡CSQL Server 2005 ¤j´T¼W¥[¤F·s¥\¯à¡A·íµM¤]»Ý­n¤j´TÂX¼W T-SQL »y¨¥
¥H¾Þ±±³o¨Ç¥\¯à¡A¼W¥[°õ¦æ®Ä²v»P¿ù»~³B²zªº¾÷¨î¡A¦P®É¬°¤F´£¨Ñµ{¦¡¶} µoªº¯à¤O¡AT-SQL ¦³ªº»yªk¤]¥[¥H½·s¡A³z¹L§óÂ×´Iªº¿ï¶µ¨Ó§e²{ SQL Server 2005¡C

T-SQL»y¨¥¦³¨âºØ¥D­nªº°Ï¤À¡G¸ê®Æ©w¸q»y¨¥ (Data Definition Language¡ADDL)¡A¥Î©ó©w¸q»PºÞ²z©Ò¦³ SQL ¸ê®Æ®wª«¥ó¡F¦Ó¸ê®Æ¾Þ§@»y¨¥ (Data Manipulation Language¡ADML)¡A¬O¥Î©ó¿ï¨ú¡B´¡¤J¡B§ó·s»P§R°£¨Ï¥Î DDL ©Ò©w¸qªºª«¥ó¤¤ªº¸ê®Æ¡C¥Î©óºÞ²z¸ê®Æ®w¡B¸ê®Æªí»PÀ˵øªíµ¥ª«¥óªº Transact-SQL DDL ¬O¥H¨ã©µ¦ùªº SQL-92 DDL ³¯­z¦¡¬°°ò¦¡C³o¦¸Microsoft¦bSQL Server 2005¤¤¹ï©óDDL»PDML¤¤·s¼W¤F³\¦h¥H©¹¤j«¬¸ê®Æ®w¨t²Î¤~¦³ªº¥\¯à¡AÁöµM³o¨Ç¥\¯à¹ï©ó¸ê®Æ®w¨t²Î¤£ºâ·sªºÆ[©À¡A¦ý³£¶È¦s©ó¤j«¬¸ê®Æ®w¨t²Î¡AMicrosoft³o¦¸±N¤£¦ý³o¨Ç¥\¯àÅn¬A¶i¨Ó¨Ã¥[¥H§ï¨}¡A¬Ý±o¥XMicrosoft­n·m¦û¸ê®Æ®w¥«³õªº¨M¤ß¡A§Ú­Ì´N¨Ó¬Ý¬ÝMicrosoft·s¼W¤F­þ¨Ç¥\¯à¡C

2 ¸ê®Æ©w¸q»y¨¥(Data Definition Language DDL)

2.1 ·sªº¸ê®Æ«¬ºA

SQL Server 2005 °w¹ï©ó¦r¦ê»PXMLªºÀx¦s´£¨Ñ¤F·sªº¸ê®Æ«¬ºA¡A¨ä¤º®eªí¦C¦p¤U¡G VARCHAR(MAX)/NVARCHAR(MAX)/VARBINARY(MAX)¡G·í«Å§i¤F MAX ÃöÁä¦r¡A¸ÓÄæ¦ì³Ì¦h¥i¥H¦s©ñ 2Giga (2^31-1)¦ì¤¸²Õªº¸ê®Æ¡C¦Ó¤£¦A¨ü­­©ó¥H©¹ªº 8K(¤]´N¬O Page ªº¤j¤p)¡C³o¤TºØ¸ê®Æ«¬ºA¥i¥H¥Î¨Ó¨ú¥N text¡Bntext ¥H¤Î image µ¥¸ê®Æ«¬ºA¡C¥Ñ SQL Server ¦Û¦æ¨M©w¦s©ñ¤j«¬¸ê®Æªº¤è¦¡¡A¦Ó¤£»Ý§Ú­Ì¨Æ¥ý¨M©w­n¥Î«ü¼Ðµ²ºc¦s©ñ text ¤@Ãþªº¸ê®Æ¡AÁÙ¬O¤@¯ëªº char µ¥¸ê®Æ®æ¦¡¡C¦Ó¥H VARCHAR(MAX)/NVARCHAR(MAX) ¨ú¥N text¡Bntext ³Ì¤jªº¦n³B¦b©ó¤@¯ëªº T-SQL ¦r¦ê³B²z¨ç¼Æ³£¥i¥H¾Þ§@ VARCHAR(MAX)/NVARCHAR(MAX) Äæ¦ì¤ºªº¸ê®Æ¡A¦Ó¤£¹³ text¡Bntext ·|Åý«Ü¦h¨ç¼ÆµLªk¨Ï¥Î¡C

XML¡G­ì¥Íªº XML ¸ê®Æ«¬ºA¡A¥i¥H´£¨Ñ XML ¸ê®ÆÅçÃÒ¡B¬d¸ß¡B§ó·s¡B«Ø¥ß¯Á¤Þµ¥µ¥¡C¸Ó«¬ºAªº¸ê®Æ³Ì¤jªø«×¤]¬O 2 Giga ¦ì¤¸²Õ¡C

2.2 ¯Á¤Þ(Index)

¯Á¤Þ¬°ºûÅ@¬O«O«ùSQL Server®Ä¯àªº­«­n¤u§@¤§¤@¡A¥H©¹³\¦h­nÂǧU¨t²Î¹w¦sµ{§Ç¡BDBCC µ¥©R¥O¤~¯à§¹¦¨³o¨Ç¤u§@¡A¦bSQL Server2005¤¤¹ï¦¹°µ¤F§ï¨}¡AT-SQL ªº DDL ¹ïºûÅ@¯Á¤Þ¦³§ó§¹³Æªº»yªk¡A§ï¥H CREATE¡BALTER¡BDROPµ¥¼Ð·Ç»yªk¨Ó§¹¦¨¡AÅý T-SQL ªº»yªk§ó¤@­P¤Æ¡A¨Ò¦p­««Ø¯Á¤Þ©Î¥h°£¤£³sÄòªº¸ê®Æ¤£¹³¥H©¹»ÝÂǧU DBCC «ü¥O¡C
EX: ALTER »yªk·s¼W DISABLE ¿ï¶µ¡A¥i¥H°±±¼ SQL Server ¹ï¬Y­Ó¯Á¤ÞªººûÅ@»P¨Ï¥Î¡C

2.3 ¤Á³Î¸ê®Æªí(Partition Table)

SQL Server 2005·s¼W¤@­Ó±M¬°¤j«¬¸ê®Æ®w´£¨Ñªº Partition Table¾÷¨î¡A
¤Á³Îµ{¦¡¥\¯à»P¸ê®Æ¤@ª½¬O³]­p¤j«¬¨t²Î®É©Ò¥²³Æªº§Þ¥©¡AÁקK¨Ï¥Î¤@­Ó¤p¥\¯à¡A«o»Ý­n±Ò°Ê¤@­Ó¤jª«¥ó¡A©Î¬O¦s¨ú§½³¡ªº¸ê®Æ«o»Ý­n¦b¸ê®Æ®ü¤¤¼´°w¡C

¦b¥H©¹ SQL Server 2000 ª©¥»¹ï©ó¶W¤jªº¸ê®Æ¬ö¿ý¶°¦X¥i¥H­É§U©ó Partition View¡A¨Ã¦b·s¼W¡B­×§ï©M§R°£¸ê®Æ®É¡A¥H Instead of Trigger ¨Ó²¤ÆºÞ²z»P¶}µoªº½ÆÂø«×¡C¦ý²¦³º¦h­Ó¸ê®Æªí·|Åý¦w¥þ³]©w¡B­­¨î¦¡(Constraint)¡B¯Á¤Þ»P¸ê®ÆºûÅ@µ¥µ¥¤é±`¤u§@Åܱo½ÆÂø¡C¨Ã¦b¸ê®Æªí·s¼W»P§R°£¤j¶q¬ö¿ý®É¯Ó¶O¥æ©ö¬ö¿ý(Transaction Log)¡C

¦b SQL Server 2005 °£¤F·s¼W¤F Partition Table ¨Ó´£¨Ñ¬Û¦üªº¥\¯à¡A§ó¶i¤@¨B¦aÁôÂäFµ²ºc¤Wªº®t²§¡A²¤Æ¤Á³Î¸ê®Æ«á³y¦¨¸ê®Æ®w³]­p¡BºÞ²z¡BºûÅ@»P¨Ï¥Î¤Wªº¤£«K¡C
Partition Table°£¤F¹ï©ó¨t²Î¶}µo»P¸ê®ÆºÞ²z·¥¦³À°§U¡A§G¸p¦b¦hCPU¥D¾÷ÁÙÂÇ¥­¦æ¹Bºâ§Þ³N´£°ª¨t²Î®Ä¯à¡A¨Ò¦p¡G³z¹L¦hÁû CPU ¹ï¦h­Ó Partition °µ¥­¦æ¹Bºâ¡AÅý¸ê®Æªí¤À´²¦s¨ú¡A³£±N¥i´£¤É¦s¨úªº®Ä¯à¡C

2.4 DDL IJµoµ{§Ç

IJµoµ{§Ç(Trigger)¥H©¹¥Î¦b¯S©wªºª«¥ó¤W¡A¨Ò¦p¸ê®Æªí©ÎÀ˵øªí¡A·í¸ê®ÆºûÅ@»y¨¥(DML)ªº Insert¡BDelete¡BUpdate »yªk°w¹ï³o¨Çª«¥ó¹B§@®É¡A¥Ñ¨t²Î¦Û°Ê©I¥s¹ïÀ³ªºÄ²µoµ{§Ç¡A¦Ó¦b SQL Server 2000 ª©¥»®ÉÁÙ¼W¥[¤F Instead of Trigger¡A³z¹LIJµoµ{§Ç¨ú¥N­ì¥»­n°õ¦æªº·s¼W¡B­×§ï¡B§R°£»yªk¡C

SQL Server 2005 ÂX¼W¤FIJµoµ{§ÇªºÀ³¥Î­±¡A¥[¤J¸ê®Æ©w¸q»y¨¥(DDL)IJµoµ{§Ç¥\¯à¡C°w¹ï DDL »yªkªº°õ¦æ¤]¥i¥H±Ò°ÊIJµoµ{§Ç¡A§A¥i¥Î¨Ó°lÂÜ»PºÊ±±¸ê®Æ®w¬[ºcªºÅܤơA¨Ò¦p·s¼W¡B­×§ï©Î§R°£¸ê®Æªí®É¡A¬ö¿ý¬O½Ö¦b¦ó®É¹ï­þ¨Ç¸ê®Æªíªº©w¸q°µ¤F¤°»ò¼Ëªº§ó°Ê¡C

§A¥i¯à°w¹ï¸ê®Æ®wµ¥¯Åªº»yªkIJµo DDL IJµoµ{§Ç¡A¨Ò¦p CREATE_TABLE¡C¤]¥i¥H¬O¦øªA¾¹µ¥¯Åªº»yªk¡A¦pCREATE_LOGIN¡C³z¹L¦bIJµoµ{§Ç¤º°õ¦æROLLBACK TRANSACTION »yªk¯à°÷±N­ì¨Ó¨Ï¥ÎªÌ°õ¦æªº DDL¦^´_¡A´N¦p¦P¨S¦³°õ¦æ¸Ó»yªk¡C»P DML IJµoµ{§Ç¬Û¦Pªº¬O¡G°õ¦æ¤@¥y DDL ¥i¯à¦P®ÉIJµo¦h­Ó DDL IJµoµ{§Ç¡A¦ý§Ú­ÌµLªk´x±±¨ä°õ¦æ¶¶§Ç¡A©Ò¥H DDL IJµoµ{§Ç¶¡¤£¯à¦³¥ý«áªº¨Ì¦sÃö«Y¡C

3 ¸ê®ÆºûÅ@»y¨¥(Data Manipulation Language DML)

3.1 Common Table Expression(CTE)

Common table expression(CTE) ¥i¥Hµø¤§¬°¼È¦sªºÀ˵øªí¡A¨ä¥\¯à¬Û·í©óÀ˵øªí(View) ¦ý¥¦ªº¥Í©R¶g´Á¶È¦s¨ú³æ¤@¦¸ªº T-SQL §å¦¸(batch)»yªk¤¤¡A¦Ó¤£¦ü¤@¯ëªº¼È¦sª«¥ó¨ä¥Í©R¶g´Á»P³s½u(connection)¦P¦b¡A¦P®É­Ý¨ãView©M­l¥Í¸ê®Æªí(Derived table)ªº¯à¤O¡C

¦]¬°¥Í©R¶g´Á¶È¦s¨ú³æ¤@¦¸ªº T-SQL §å¦¸(batch)»yªk¤¤¡A©Ò¥H©w¸q»P¨Ï¥Î»Ý­n¦b¬Û¦P§å¦¸¤¤¤@°_°õ¦æ¡A°õ¦æ§¹¸Ó§å¦¸«á¡ACTE ª«¥ó¥ß¨è¥¢®Ä¡C

3.2 ¨ú±o±Æ¦W©Î¶¶§Çªº¨ç¼Æ

¥H©¹§Ú­Ì¶È¯à¨Ï¥ÎORDER BY»yªk¹ï¬d¸ß¥X¨Óªºµ²ªG¶i¦æ±Æ§Ç¡A¦bSQL Server 2005¤¤·s¼W¤F¼Æ­ÓÃö©ó¬ö¿ý¦b¸ê®Æ¶°¦X¤¤ªº¶¶§Ç(Ranking)¤§¨ç¼Æ¡A¨Ï¥ÎOVER ¤l¥y·f°tRANK¡BDENSE_RANK¡BROW_NUMBER ©M NTILEµ¥¨ç¼Æ¡A¥i¥H¹F¨ì¶i¶¥ªº¸ê®Æ±ÆÄòµ²ªG¡A¨ä¥\¯à¦p¤U¡G

RANK ¦bµ²ªG¶°¤¤¨C¤@µ§¬ö¿ý©Ò¦bªº±Æ¦W¦ì¸m¡A¦ý±Æ¦W¥i¯à¤£³sÄò¡A¨Ò¦p­Y¦³¨â­Ó²Ä¤@¦W¡A«h¤U¤@­Ó¦W¦¸ª½±µ¸õ¦Ü²Ä¤T¦W¡C

DENSE_RANK ¥\¯à»P RANK ¬Û¦ü¡A¦ý¥Nªí±Æ¦Wªº¼Æ­È¬O³sÄòªº¡C

ROW_NUMBER ¨Ì·Ó¸s²Õ§e²{¨C¤@µ§¬ö¿ý¦b¸Ó¸s¤¤¥X²{ªº¶¶§Ç¦ì¸m¡C

NTILE ¨Ì·Ó«ü©wªº¤À¸s¼Æ¶q±Nµ²ªG¶°¤Á¤À(partition)¡A¨Ã§e²{¬ö¿ý¦b¦U¸sªº±Æ¦W¦ì¸m¡C
°£¦¹¤§¥~¡AÁÙ¥i¨Ï¥ÎPARTITION BY ¤l¥y±N¬d¸ßµ²ªG¶i¦æ¤À¸s¡A­Y¬Ù²¤¤F PARITITION BY ¤l¥y«hµø¥þ³¡ªº¬ö¿ý¬°¤@¸s¡C

3.3 µ²ºc¤Æ¿ù»~³B²z

¦bSQL Server 2000¥H«eªºª©¥»¡A¿ù»~³B²zªºµ²ºc¹L©ó²³æ¡A¦b¼¶¼g¸û¬°½ÆÂøªº¹w¦sµ{§Ç®É¡AµLªk«Ø¥ß§¹µ½ªº¿ù»~³B²z¾÷¨î¡A³\¦h¿ù»~¬OµLªk³z¹L¿ù»~³B²z¾÷¨î¨Ó§ïµ½ªº¡C¡AÁ`¬O¥O¶}µo¤H­û»á¬°§xÂZ¡C¨ä¿ù»~³B²zªºµ²ºc SQL Server 2005 ´£¨Ñ¤FÃþ¦ü C++ ©Î .NET »yªkªº TRY¡KCATCH ¾÷ ¨î¡AÅý§Ú­Ì¦b¼¶¼g T-SQL µ{¦¡®É¤]¥i¥H°µµ²ºc¤Æ¿ù»~³B²z¡A´î¤Öµ{¦¡¼g§@ ªº½ÆÂø©Ê¨Ã´£¤Éµ{¦¡½Xªº¥iŪ©Ê¡F¤]´N´£¤É¤Fµ{¦¡½Xªº¥iºûÅ@©Ê»Pí©w ©Ê¡C

3.4 APPLY ¹Bºâ¤l

APPLY ¹Bºâ¤l¬O SQL Server 2005 ·s¼Wªº¡CÅý SELECT ¬d¸ß»yªk¥i»P ¶Ç¦^¸ê®Æªíªº¨ç¼Æ(table-valued function TVF)°µ¶i¤@¨Bªºµ²¦X¡C¨Ò¦p¡G³o¦b¸ê®Æ ªí§t¦³ XML Äæ¦ì®É¡Aµ²¦X XML ªº¤º®eÂà´«¬°·sªº¸ê®ÆªíÄæ¦ì»á¬°¤è«K¡C APPLY ¹Bºâ¤lÅý¨C¤@µ§¬ö¿ý³£©I¥s¤@¦¸ TVF¡A¨Ã±Nµ²ªG»P­ì¸ê®Æªíªº¤º ®e¤@°_®i¶}¡C APPLY ©w¸q¦b¬d¸ßªº FROM ¤l¥y¤º¡A¨ä®æ¦¡¦³¨âºØ«¬ºA¡GCROSS APPLY©M OUTER APPLY¡C¨âªÌªº®t²§»P¨Ï¥Î¤è¦¡»P JOIN ¹Bºâ¤lÃþ¦ü¡C

CROSS APPLY¡G¥u¦b·í¥~³¡ªº¸ê®Æªí³vµ§¬ö¿ý±a¤J¨ì TVF ¤§«á¡A­Y TVF ¨ÃµL²Å¦Xªº¬ö¿ý¶Ç¦^¨Ó¡A«h¹Bºâ±N¤£·|§e²{¸Óµ§¬ö¿ý¡C

OUTER APPLY¡G¨ÌµM·|®i²{¥~³¡¸ê®Æªí¹ïÀ³ªº¬ö¿ý¡A¦ý TVF ¬ÛÃöªºÄæ¦ì«h¥H NULL §e²{¡C

3.5 Pivot ©M UnPivot »yªk

Pivot »yªk´£¨ÑÃþ¦ü¼Ï¯Ã¤ÀªRªíªº¥\¯à¡AÅý¤@µ§µ§ªº¬ö¿ý¥i¥H¬Y­ÓÄæ¦ìÂন¦UÄæ¡A¨Ã¦bÄæ¦C¥æ¿ùªº¦U¸ê®Æ®æ¶ñ¤J·JÁ`ªº­È¡A¤@¯ë¤]ºÙ³oºØªº¬d¸ß¤è¦¡¬° crosstab ¬d¸ß¡A¤]´N¬O MS Access ´£¨Ñ¤§ TRANSFORM »yªkªº¥\¯à¡C

3.6 Output »yªk

OUTPUT ¤l¥y¬OSQL Server 2005¬° INSERT¡BDELETE¡BUPDATE ©Ò ·s¼Wªº¡C¦b INSERT¡BDELETE¡BUPDATE »yªk¤¤²{¦b¥i¥H·f°t OUTPUT ¤l¥y¡A¤Þ¥Î¥H©¹¦b¼g Trigger ®É¬Û¦Pªº¯S®í¨t²Î¸ê®Æªí INSERTED ©M DELETED¡C

3.7 «Å§i°Ñ·Ó§¹¾ã©Ê¥\¯àªº¼W±j

Integrity Constraints ¦bÃöÁp¦¡¸ê®Æ®w¤¤¬O«Ü­«­nªºÆ[©À¡C®Ú¾ÚANSI SQL-92¼Ð·Ç¹ï©ó¥~Áä(Foreign Key)­­¨î¦¡(Constraint)¦b­×§ï¸ê®Æ®É¡F©w¸q¤F¥|ºØ¦]À³¤è¦¡¡G
ƒÜ set NULL¡G§Y·íParentTable¤¤§R°£©Î­×§ï¤@µ§¸ê®Æ®É¡AForeign Table¤Wªº¸ê®Æ¬O³]¬°NULL¡C
ƒÜ set Default¡G³]Foreign Key¬°Default Value¡C
ƒÜ Cascade¡G§Y·í§R°£©Î­×§ïParent Table®É,¹ïForeign Table¤]°µ¦P¼Ëªº§R°£©Î­×§ï¡C
ƒÜ No Action¡G§Y·í¦¹µ§¸ê®Æ¦s¦b¦³Foreign Key®É¡A¤£¤¹³\°µ§R°£©Î­×§ï¡C

SQL Server 2000 ª©¥»¥u¤ä´©¤F¨âºØ¡GNo Action©MCascade§ó·s¡C¦b SQL Server 2005 «h¹ï DELETE©M UPDATE ¦A¼W¥[¤F SET DEFAULT ©M SET NULL ¨âºØ¥\¯à¡C

4 «á°O

Microsoft ±NSQL Server 2005©w¦ì¬°¤U¤@¥Nªº¸ê®ÆºÞ²z©M¤ÀªR³nÅé¡A¦b¤d©I¸U³ê¤U¡A¥Ø«e¤]¥uÄÀ¥XBeta 2¡A¨ä·s¼W¥\¯à·íµM¤£¶È©ó¦¹¡A¥»¤å¶È°w¹ïT-SQL°µ²Ê²Lªº¤¶²Ð¡A¦Ü©ó¨ä¥¦ªº³Ð·s§ï¨}¦p¡G°Ó·~´¼¼z¥\¯à¡B¡BData Miningºtºâªk¡B³øªíªA°Èµ¥¡A«h¯d«Ý¨Ó¤é¦A°µ»¡©ú¡C

°Ñ¦Ò¤åÄm
1. http://www.dbworld.com.tw/
2. http://www.microsoft.com/taiwan/sql/