《數(shù)據(jù)庫應(yīng)用基礎(chǔ)(SQL Server 2016)》項(xiàng)目7 Transact-SQL編程_第1頁
《數(shù)據(jù)庫應(yīng)用基礎(chǔ)(SQL Server 2016)》項(xiàng)目7 Transact-SQL編程_第2頁
《數(shù)據(jù)庫應(yīng)用基礎(chǔ)(SQL Server 2016)》項(xiàng)目7 Transact-SQL編程_第3頁
《數(shù)據(jù)庫應(yīng)用基礎(chǔ)(SQL Server 2016)》項(xiàng)目7 Transact-SQL編程_第4頁
《數(shù)據(jù)庫應(yīng)用基礎(chǔ)(SQL Server 2016)》項(xiàng)目7 Transact-SQL編程_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

項(xiàng)目7Transact-SQL編程理解Transcact-SQL基本組成掌握流程控制語句的使用方法掌握函數(shù)的使用方法掌握游標(biāo)的使用方法掌握處理事務(wù)的方法項(xiàng)目目標(biāo)7.1.1Transact-SQL語言組成1.數(shù)據(jù)定義語言數(shù)據(jù)定義語言(DDL)用于創(chuàng)建數(shù)據(jù)庫和各種數(shù)據(jù)庫對(duì)象。2.數(shù)據(jù)操作語言數(shù)據(jù)操作語言(DML)主要用于操作向表中添加數(shù)據(jù)、更改表中的數(shù)據(jù)以及從表中刪除數(shù)據(jù)。3.數(shù)據(jù)控制語言數(shù)據(jù)控制語言主要用于執(zhí)行與安全管理相關(guān)的操作,以確保數(shù)據(jù)庫的安全。4.事務(wù)管理語言事務(wù)管理語言主要用于執(zhí)行開始、提交和回滾事件相關(guān)的操作。5.附加語言元素附加的語言元素主要包括標(biāo)識(shí)符、變量和常量、運(yùn)算符、數(shù)據(jù)類型、函數(shù)、流程控制語句、錯(cuò)誤處理語言以及注釋語句等。任務(wù)7.1理解Transcact-SQL7.1.2批處理與腳本批處理就是包含一個(gè)或多個(gè)Transact-SQL語句的組,從應(yīng)用程序一次性地發(fā)送到SQLServer進(jìn)行執(zhí)行。SQLServer將批處理的語句編譯為一個(gè)可執(zhí)行單元,稱為執(zhí)行計(jì)劃。執(zhí)行計(jì)劃中的語句每次執(zhí)行一條。使用GO命令可以向SQLServer實(shí)用工具發(fā)出一批Transact-SQL語句結(jié)束的信號(hào)。GO并不是Transact-SQL語句,它是sqlcmd實(shí)用工具和SQLServerManagementStudio代碼編輯器識(shí)別的命令,可以解釋為應(yīng)該向SQLServer實(shí)例發(fā)送當(dāng)前批語句的信號(hào)。當(dāng)前批語句由上一個(gè)GO命令后輸入的所有語句組成。GO命令與Transact-SQL語句不能在同一行中,但是GO后面可以跟一個(gè)正整數(shù),以指定GO之前的批處理執(zhí)行的次數(shù),GO命令行也可以包含注釋。任務(wù)7.1理解Transcact-SQL7.1.3標(biāo)識(shí)符創(chuàng)建數(shù)據(jù)庫對(duì)象時(shí)需要使用標(biāo)識(shí)符對(duì)其進(jìn)行命名。在SQLServer中,所有內(nèi)容都可以有標(biāo)識(shí)符,例如服務(wù)器、數(shù)據(jù)庫以及表、視圖、列、索引、觸發(fā)器、過程、約束和規(guī)則等數(shù)據(jù)庫對(duì)象都可以有標(biāo)識(shí)符。大多數(shù)對(duì)象要求有標(biāo)識(shí)符,但對(duì)有些對(duì)象(例如約束)而言,標(biāo)識(shí)符是可選的。對(duì)象標(biāo)識(shí)符是在定義對(duì)象時(shí)創(chuàng)建的,隨后可以使用標(biāo)識(shí)符來引用該對(duì)象。標(biāo)識(shí)符的排序規(guī)則取決于定義標(biāo)識(shí)符時(shí)所在的級(jí)別。為實(shí)例級(jí)對(duì)象(例如登錄名和數(shù)據(jù)庫名)的標(biāo)識(shí)符指定的是實(shí)例的默認(rèn)排序規(guī)則。為數(shù)據(jù)庫對(duì)象(例如表、視圖和列名)的標(biāo)識(shí)符指定的是數(shù)據(jù)庫的默認(rèn)排序規(guī)則。標(biāo)識(shí)符分為常規(guī)標(biāo)識(shí)符和分隔標(biāo)識(shí)符兩類。常規(guī)標(biāo)識(shí)符符合標(biāo)識(shí)符的格式規(guī)則,當(dāng)在Transact-SQL語句中使用常規(guī)標(biāo)識(shí)符時(shí)不用將其分隔開。分隔標(biāo)識(shí)符包含在雙引號(hào)(")或方括號(hào)([])內(nèi)。在Transact-SQL語句中,符合標(biāo)識(shí)符格式規(guī)則的標(biāo)識(shí)符可以分隔,也可以不分隔;對(duì)不符合所有標(biāo)識(shí)符規(guī)則的標(biāo)識(shí)符則必須用雙引號(hào)或括號(hào)進(jìn)行分隔。常規(guī)標(biāo)識(shí)符和分隔標(biāo)識(shí)符包含的字符數(shù)必須在1~128之間。對(duì)于本地臨時(shí)表,標(biāo)識(shí)符最多可以有116個(gè)字符。當(dāng)使用標(biāo)識(shí)符作為對(duì)象名稱時(shí),完整的對(duì)象名稱由四個(gè)標(biāo)識(shí)符組成:服務(wù)器名稱、數(shù)據(jù)庫名稱、架構(gòu)名稱和對(duì)象名稱。標(biāo)識(shí)符的語法格式如下。[[[服務(wù)器.][數(shù)據(jù)庫].][架構(gòu)].]對(duì)象任務(wù)7.1理解Transcact-SQL7.1.4常量1.字符串常量字符串常量必須使用一對(duì)單引號(hào)括起來,可以包含字母(a~z、A~Z)、漢字、數(shù)字字符(0~9)以及其他特殊字符,如感嘆號(hào)(!)、at符(@)和數(shù)字符(#)等。例如,'數(shù)據(jù)庫應(yīng)用基礎(chǔ)','SQLServer2016數(shù)據(jù)庫'。2.Unicode字符串Unicode字符串的格式與普通字符串相似,但它前面有一個(gè)N標(biāo)識(shí)符。N前綴必須是大寫字母。例如,'Michél'是字符串常量,而N'Michél'則是Unicode常量。3.二進(jìn)制常量二進(jìn)制常量用十六進(jìn)制數(shù)字字符串來表示,以0x作為前綴,不使用引號(hào)。例如,0xAE,0x12Ef,0x69048AEFDD010E,0x(二進(jìn)制空串)。4.bit常量bit常量用數(shù)字0或1表示,不使用引號(hào)。如果使用一個(gè)大于1的數(shù)字,它將會(huì)被轉(zhuǎn)換為數(shù)字1。5.datetime常量datetime常量使用特定格式的字符日期值來表示,并使用單引號(hào)括起來。日期常量示例:'2019-10-01','October1,2019','10/01/2019'。時(shí)間常量示例:'20:30:12','08:30PM'。任務(wù)7.1理解Transcact-SQL6.integer常量integer常量用一串?dāng)?shù)字來表示,不含小數(shù)點(diǎn),不使用引號(hào)。例如,123,2020。7.decimal常量decimal常量用一串?dāng)?shù)字來表示,可以包含小數(shù)點(diǎn),不使用引號(hào)。例如,1894.1204,2.0。8.float和real常量float和real常量使用科學(xué)記數(shù)法表示。例如,101.5E5,0.5E-2。9.money常量money常量用一串?dāng)?shù)字,可以包含或不包含小數(shù)點(diǎn),以一個(gè)貨幣符號(hào)($)作為前綴,不使用引號(hào)。例如,$12,$542023.14。10.uniqueidentifier常量uniqueidentifier常量是表示全局唯一標(biāo)識(shí)符(GUID)值的字符串,可使用字符串或二進(jìn)制字符串格式來表示。例如,'6F9619FF-8B86-D011-B42D-00C04FC964FF'和0xff19966f868b11d0b42d00c04fc964ff表示相同的GUID。11.指定負(fù)數(shù)和正數(shù)若要指明一個(gè)數(shù)是正數(shù)還是負(fù)數(shù),應(yīng)對(duì)數(shù)字常量前面加上正號(hào)(+)或負(fù)號(hào)(?),由此得到有符號(hào)數(shù)字值的常量。任務(wù)7.1理解Transcact-SQL7.1.5局部變量1.聲明局部變量DECLARE{@局部變量名[AS]數(shù)據(jù)類型}[,..]2.設(shè)置局部變量的值SET@局部變量名=表達(dá)式3.顯示局部變量的值當(dāng)使用SELECT語句時(shí),如果省略局部變量后面的賦值號(hào)(=)和相應(yīng)的表達(dá)式,則可以將局部變量的值顯示出來。此外,也可以使用PRINT語句可以向客戶端返回局部變量的值或者用戶自定義的消息,語法格式如下。PRINT字符串常量|@局部變量名|字符串表達(dá)式任務(wù)7.1理解Transcact-SQL7.1.6表達(dá)式表達(dá)式是標(biāo)識(shí)符、值和運(yùn)算符的組合,Transact-SQL可以對(duì)其求值以獲取結(jié)果。訪問或更改數(shù)據(jù)時(shí),可以在多個(gè)不同的位置使用數(shù)據(jù)。例如,可以將表達(dá)式用作要在查詢中檢索的數(shù)據(jù)的一部分,也可以用作查找滿足一組條件的數(shù)據(jù)時(shí)的搜索條件。表達(dá)式可以是常量、函數(shù)、列名、變量、子查詢、CASE、NULLIF或COALESCE,也可以用運(yùn)算符對(duì)這些實(shí)體進(jìn)行組合以生成表達(dá)式。在表達(dá)式中,應(yīng)使用單引號(hào)將字符串和日期值括起來。使用運(yùn)算符可以執(zhí)行算術(shù)、比較、串聯(lián)或賦值操作。例如,可以測(cè)試數(shù)據(jù)以確??蛻魯?shù)據(jù)的國家/地區(qū)列已填充或非空。在查詢中,可以查看表(應(yīng)與某種類型的運(yùn)算符一起使用)中的數(shù)據(jù)的任何用戶都可以執(zhí)行操作。必須具有相應(yīng)權(quán)限才能成功更改數(shù)據(jù)。在Transact-SQL中,使用運(yùn)算符可以執(zhí)行下列操作:永久或臨時(shí)更改數(shù)據(jù);搜索滿足指定條件的行或列;在數(shù)據(jù)列之間或表達(dá)式之間進(jìn)行判斷;在開始或提交事務(wù)之前,或者在執(zhí)行特定代碼行之前測(cè)試指定條件。任務(wù)7.1理解Transcact-SQL7.1.7空值空值(NULL)表示值未知??罩挡煌诳瞻谆蛄阒怠]有兩個(gè)相等的空值。比較兩個(gè)空值或?qū)⒖罩蹬c任何其他值相比均返回未知,這是因?yàn)槊總€(gè)空值均為未知??罩狄话惚硎緮?shù)據(jù)未知、不適用或?qū)⒃谝院筇砑訑?shù)據(jù)。例如,學(xué)生的成績(jī)?cè)谏沙煽?jī)單時(shí)可能不知道。在SQL-92標(biāo)準(zhǔn)中,引入了關(guān)鍵字ISNULL和ISNOTNULL來測(cè)試是否存在空值。若要在查詢中測(cè)試空值,可在WHERE子句中使用ISNULL或ISNOTNULL。在SQLServerManagementStudio代碼編輯器中查看查詢結(jié)果時(shí),空值在結(jié)果集中顯示為NULL。若要在表列中插入空值,可在INSERT或UPDATE語句中顯式聲明NULL,或不讓列出現(xiàn)在INSERT語句中,或使用ALTERTABLE語句在現(xiàn)有表中新添一列。不能將空值用于區(qū)分表中兩行所需的信息,例如外鍵或主鍵。在程序代碼中,可以檢查空值以便只對(duì)具有有效(或非空)數(shù)據(jù)的行執(zhí)行某些計(jì)算。如果包含空值列,則某些計(jì)算(如平均值)就會(huì)不準(zhǔn)確,因此執(zhí)行計(jì)算時(shí)刪除空值很重要。如果數(shù)據(jù)中可能存儲(chǔ)有空值而又不希望數(shù)據(jù)中出現(xiàn)空值,就應(yīng)該創(chuàng)建查詢和數(shù)據(jù)修改語句,刪除空值或?qū)⑺鼈冝D(zhuǎn)換為其他值。如果數(shù)據(jù)中出現(xiàn)空值,則邏輯運(yùn)算符和比較運(yùn)算符有可能返回TRUE或FALSE以外的第三種結(jié)果,即UNKNOWN。這種三值邏輯是導(dǎo)致許多應(yīng)用程序出現(xiàn)錯(cuò)誤的根源。任務(wù)7.1理解Transcact-SQL7.1.8注釋語句1.行內(nèi)注釋使用雙連字符(--)可以將注釋文本插入單獨(dú)行中、嵌套在Transact-SQL命令行的結(jié)尾或嵌套在Transact-SQL語句中,服務(wù)器不對(duì)這些注釋進(jìn)行計(jì)算。語法如下:--注釋文字2.塊注釋使用正斜杠-星號(hào)字符對(duì)(/*...*/)也可以添加注釋文本,服務(wù)器不計(jì)位于/*與*/之間的文本。語法格式如下:/*注釋文字*/任務(wù)7.1理解Transcact-SQL7.2.1BEGIN...END語句BEGIN...END語句用于將一系列的Transact-SQL語句組合成一個(gè)語句塊(相當(dāng)于其他高級(jí)語言中的復(fù)合語句),從而可以執(zhí)行一組Transact-SQL語句,語法格式如下。BEGIN{語句|語句塊}END其中語句和語句塊別表示使用BEGIN...END語句塊定義的任何有效的Transact-SQL語句或語句組。BEGIN...END語句塊允許嵌套。任務(wù)7.2使用流程控制語句7.2.2IF...ELSE語句IF...ELSE語句在滿足指定條件時(shí)執(zhí)行一組Transact-SQL語句,當(dāng)不滿足指定條件時(shí)執(zhí)行另一組Transact-SQL語句,語法格式如下。IF布爾表達(dá)式

{語句|語句塊}[ELSE{語句|語句塊}]其中布爾表達(dá)式的返回值為TRUE或FALSE。如果布爾表達(dá)式中含有SELECT語句,則必須用圓括號(hào)將SELECT語句括起來。{語句|語句塊}是任何Transact-SQL語句或用語句塊定義的語句分組。除非使用語句塊,否則IF或ELSE條件只能影響一個(gè)Transact-SQL語句的性能。如果需要定義語句塊,請(qǐng)使用BEGIN...END語句。如果布爾表達(dá)式返回TRUE,則執(zhí)行IF關(guān)鍵字及其條件之后的Transact-SQL語句??蛇x的ELSE關(guān)鍵字引入另一個(gè)Transact-SQL語句,當(dāng)布爾表達(dá)式返回FALSE時(shí)執(zhí)行該語句。任務(wù)7.2使用流程控制語句7.2.3CASE函數(shù)1.簡(jiǎn)單CASE函數(shù)CASE輸入表達(dá)式

WHEN匹配表達(dá)式1THEN結(jié)果表達(dá)式1WHEN匹配表達(dá)式2THEN結(jié)果表達(dá)式2...[ELSE結(jié)果表達(dá)式n]END其中輸入表達(dá)式指定使用簡(jiǎn)單CASE格式時(shí)所計(jì)算的表達(dá)式,可以是任意有效的表達(dá)式。WHEN匹配表達(dá)式指定使用簡(jiǎn)單CASE格式時(shí)要與輸入表達(dá)式進(jìn)行比較的簡(jiǎn)單表達(dá)式。匹配表達(dá)式是任意有效的表達(dá)式。輸入表達(dá)式與每個(gè)匹配表達(dá)式的數(shù)據(jù)類型必須相同,或者必須是隱式轉(zhuǎn)換的數(shù)據(jù)類型。THEN結(jié)果表達(dá)式指定當(dāng)輸入表達(dá)式=匹配表達(dá)式計(jì)算結(jié)果為TRUE時(shí)返回的表達(dá)式。結(jié)果表達(dá)式可以是任意有效的表達(dá)式。ELSE結(jié)果表達(dá)式n指定比較運(yùn)算計(jì)算結(jié)果不為TRUE時(shí)返回的表達(dá)式。如果忽略此參數(shù)且比較運(yùn)算計(jì)算結(jié)果不為TRUE,則CASE返回NULL。結(jié)果表達(dá)式n是任意有效的表達(dá)式。所有結(jié)果表達(dá)式的數(shù)據(jù)類型必須相同或必須是隱式轉(zhuǎn)換的數(shù)據(jù)類型。任務(wù)7.2使用流程控制語句7.2.3CASE函數(shù)2.CASE搜索函數(shù)CASEWHEN布爾表達(dá)式1THEN結(jié)果表達(dá)式1WHEN布爾表達(dá)式2THEN結(jié)果表達(dá)式2...[ELSE結(jié)果表達(dá)式n]ENDWHEN布爾表達(dá)式指定當(dāng)使用CASE搜索格式時(shí)所計(jì)算的布爾表達(dá)式。THEN結(jié)果表達(dá)式指定當(dāng)布爾表達(dá)式的計(jì)算結(jié)果為TRUE時(shí)返回的表達(dá)式,可是任意有效的表達(dá)式。ELSE結(jié)果表達(dá)式n指定比較運(yùn)算計(jì)算結(jié)果不為TRUE時(shí)返回的表達(dá)式。如果忽略此參數(shù)且比較運(yùn)算計(jì)算結(jié)果不為TRUE,則CASE返回NULL。結(jié)果表達(dá)式n是任意有效的表達(dá)式。所有結(jié)果表達(dá)式的數(shù)據(jù)類型必須相同或必須是隱式轉(zhuǎn)換的數(shù)據(jù)類型。任務(wù)7.2使用流程控制語句7.2.4WAITFOR語句WAITFOR語句在達(dá)到指定時(shí)間或時(shí)間間隔之前,或者指定語句至少修改或返回一行之前,阻止執(zhí)行批處理、存儲(chǔ)過程或事務(wù),語法格式如下。WAITFOR{DELAY'等待的時(shí)段'|TIME'完成的時(shí)間'}其中DELAY指定可以繼續(xù)執(zhí)行批處理、存儲(chǔ)過程或事務(wù)之前必須等待的時(shí)段,最長(zhǎng)可以是24小時(shí)。TIME指定的運(yùn)行批處理、存儲(chǔ)過程或事務(wù)的時(shí)間。完成的時(shí)間指定何時(shí)執(zhí)行WAITFOR語句。等待的時(shí)間和完成的時(shí)間可以使用datetime數(shù)據(jù)可接受的格式來指定,也可以將其指定為局部變量,但不能指定日期。因此,不允許指定datetime值的日期部分。使用WAITFOR語句可以掛起批處理、存儲(chǔ)過程或事務(wù)的執(zhí)行,直到發(fā)生以下情況:已超過指定的時(shí)間間隔;到達(dá)一天中指定的時(shí)間。任務(wù)7.2使用流程控制語句7.2.5WHILE語句WHILE語句設(shè)置重復(fù)執(zhí)行SQL語句或語句塊的條件,只要指定的條件為真,就重復(fù)執(zhí)行語句;也可以使用BREAK和CONTINUE關(guān)鍵字在循環(huán)內(nèi)部控制WHILE循環(huán)中語句的執(zhí)行。語法格式如下。WHILE布爾表達(dá)式

{語句|語句塊|BREAK|CONTINUE}其中參數(shù)布爾表達(dá)式的計(jì)算結(jié)果為TRUE或FALSE。如果布爾表達(dá)式中含有SELECT語句,則必須用括號(hào)將SELECT語句括起來。語句和語句塊分別是Transact-SQL語句或用語句塊定義的語句分組。若要定義語句塊,可以使用控制流關(guān)鍵字BEGIN和END。BREAK導(dǎo)致從最內(nèi)層的WHILE循環(huán)中退出,將執(zhí)行出現(xiàn)在END關(guān)鍵字(循環(huán)結(jié)束的標(biāo)記)后面的任何語句。如果嵌套了兩個(gè)或多個(gè)WHILE循環(huán),則內(nèi)層的BREAK將退出到下一個(gè)外層循環(huán),將首先運(yùn)行內(nèi)層循環(huán)結(jié)束之后的所有語句,然后重新開始下一個(gè)外層循環(huán)。CONTINUE使WHILE循環(huán)重新開始執(zhí)行,忽略CONTINUE關(guān)鍵字后面的任何語句。任務(wù)7.2使用流程控制語句7.2.6TRY...CATCH語句TRY...CATCH語句對(duì)Transact-SQL實(shí)現(xiàn)類似于C#和C++語言中的異常處理的錯(cuò)誤處理。Transact-SQL語句組可以包含在TRY塊中。如果在TRY塊內(nèi)部發(fā)生錯(cuò)誤,則會(huì)將控制傳遞給CATCH塊中包含的另一個(gè)語句組。語法格式如下。BEGINTRY{語句|語句塊}ENDTRYBEGINCATCH{語句|語句塊}ENDCATCH[;]其中語句為任何Transact-SQL語句;語句塊為批處理或封裝在BEGIN...END塊中的任何Transact-SQL語句組。使用TRY...CATCH可以捕捉所有嚴(yán)重級(jí)別大于10但不終止數(shù)據(jù)庫連接的錯(cuò)誤。TRY塊后必須緊跟相關(guān)聯(lián)的CATCH塊。在ENDTRY與BEGINCATCH語句之間放置任何其他語句都將生成語法錯(cuò)誤。TRY...CATCH構(gòu)造不能跨越多個(gè)批處理,也不能跨越多個(gè)Transact-SQL語句塊。任務(wù)7.2使用流程控制語句7.3.1函數(shù)概述不論是內(nèi)置函數(shù)還是用戶自定義函數(shù)都可以用在任意表達(dá)式中。例如,用在SELECT語句的選擇列表中可以返回一個(gè)值,用在SELECT、INSERT、DELETE或UPDATE語句的WHERE子句搜索條件中可以限制查詢符合條件的行,用在視圖的搜索條件中可以使視圖在運(yùn)行時(shí)與用戶或環(huán)境動(dòng)態(tài)地保持一致,用在CHECK約束或觸發(fā)器中可以在插入數(shù)據(jù)時(shí)查找指定的值,用在DEFAULT約束或觸發(fā)器中可以在INSERT語句未指定值時(shí)提供一個(gè)值,如此等等。使用函數(shù)時(shí)應(yīng)始終帶上圓括號(hào),即使沒有任何參數(shù)也是如此。但是,與DEFAULT關(guān)鍵字一起使用的niladic函數(shù)例外。在某些情況下,用來指定數(shù)據(jù)庫、計(jì)算機(jī)、登錄名或數(shù)據(jù)庫用戶的參數(shù)是可選的。如果未指定這些參數(shù),則默認(rèn)將這些參數(shù)賦值為當(dāng)前的數(shù)據(jù)庫、主機(jī)、登錄名或數(shù)據(jù)庫用戶。函數(shù)可以嵌套使用,可以將一個(gè)函數(shù)作為另一個(gè)函數(shù)的參數(shù)來使用。按照函數(shù)的返回值是否確定,可以將函數(shù)分為嚴(yán)格確定函數(shù)、確定函數(shù)和非確定函數(shù)。如果一個(gè)函數(shù)對(duì)于一組特定的輸入值始終返回相同的結(jié)果,則該函數(shù)就是嚴(yán)格確定函數(shù)。對(duì)于用戶定義的函數(shù),判斷其是否確定的標(biāo)準(zhǔn)相對(duì)寬松。如果對(duì)于一組特定的輸入值和數(shù)據(jù)庫狀態(tài),函數(shù)始終返回相同的結(jié)果,則該函數(shù)就是確定函數(shù)。如果函數(shù)是數(shù)據(jù)訪問函數(shù),即使它不是嚴(yán)格確定的,也可以從這個(gè)角度認(rèn)為它是確定的。任務(wù)7.3使用函數(shù)7.3.2字符串函數(shù)(1)返回字符表達(dá)式最左側(cè)字符的ASCII碼值:ASCII(字符串表達(dá)式)(2)CHAR函數(shù)將一個(gè)int類型的ASCII碼轉(zhuǎn)換為字符:CHAR(整型表達(dá)式)(3)LEFT函數(shù)返回字符串中從左邊開始指定個(gè)數(shù)的字符:LEFT(字符表達(dá)式,整型表達(dá)式)(4)LEN函數(shù)返回指定字符串表達(dá)式的字符數(shù)(不包括尾隨空格):LEN(字符串表達(dá)式)(5)LOWER函數(shù)將大寫字符數(shù)據(jù)轉(zhuǎn)換為小寫后返回一個(gè)字符表達(dá)式:LOWER(字符表達(dá)式)(6)LTRIM函數(shù)在刪除前導(dǎo)空格后返回一個(gè)字符表達(dá)式:LTRIM(字符表達(dá)式)(7)NCHAR函數(shù)返回具有指定整數(shù)代碼的Unicode字符:NCHAR(整型表達(dá)式)(8)REPLACE函數(shù)用另一個(gè)字符串值替換指定字符串值的所有出現(xiàn):REPLACE(字符串表達(dá)式,要查找的子字符串,替換字符串)(9)REPLICATE函數(shù)以指定次數(shù)重復(fù)字符串值:REPLICATE(字符串表達(dá)式,整型表達(dá)式)(10)REVERSE函數(shù)按相反順序返回字符串值:REVERSE(字符串表達(dá)式)任務(wù)7.3使用函數(shù)7.3.2字符串函數(shù)(11)RIGHT函數(shù)從字符串右側(cè)取出具有指定長(zhǎng)度的字符:RIGHT(字符串表達(dá)式,整型表達(dá)式)(12)RTRIM函數(shù)在截取所有尾隨空格后返回一個(gè)字符串:RTRIM(字符串表達(dá)式)(13)SPACE函數(shù)返回一串重復(fù)的空格:SPACE(整型表達(dá)式)(14)STR函數(shù)返回從數(shù)字?jǐn)?shù)據(jù)轉(zhuǎn)換的字符數(shù)據(jù):STR(浮點(diǎn)表達(dá)式,長(zhǎng)度[,小數(shù)位數(shù)])(15)STUFF函數(shù)將一個(gè)字符串插入另一個(gè)字符串,它會(huì)在第一個(gè)字符串中從指定的起始位置刪除指定長(zhǎng)度的字符,然后在該位置插入第二個(gè)字符串:STUFF(字符表達(dá)式,起點(diǎn),長(zhǎng)度,替換字符表達(dá)式)(16)SUBSTRING函數(shù)返回字符表達(dá)式、二進(jìn)制表達(dá)式、文本表達(dá)式或圖像表達(dá)式的一部分(子字符串):SUBSTRING(表達(dá)式,起始位置,長(zhǎng)度)(17)UNICODE函數(shù)返回由Unicode標(biāo)準(zhǔn)定義的整數(shù)值,用于輸入表達(dá)式的第一個(gè)字符:UNICODE(字符表達(dá)式)(18)UPPER函數(shù)將小寫字符數(shù)據(jù)轉(zhuǎn)換為大寫后返回一個(gè)字符表達(dá)式:UPPER(字符表達(dá)式)任務(wù)7.3使用函數(shù)7.3.3數(shù)學(xué)函數(shù)(1)ABS函數(shù)返回指定數(shù)值表達(dá)式的絕對(duì)值:ABS(數(shù)值表達(dá)式)(2)CEILING函數(shù)返回大于或等于指定數(shù)值表達(dá)式的最小整數(shù):CEILING(數(shù)值表達(dá)式)(3)FLOOR函數(shù)返回小于或等于指定數(shù)值表達(dá)式的最大整數(shù):FLOOR(數(shù)值表達(dá)式)(4)POWER函數(shù)返回指定表達(dá)式值的指定次的冪:POWER(底數(shù),指數(shù))(5)RAND函數(shù)返回從0到1的偽隨機(jī)浮點(diǎn)值:RAND([種子])(6)ROUND函數(shù)返回一個(gè)數(shù)值,舍入到指定的長(zhǎng)度或精度:ROUND(數(shù)值表達(dá)式,長(zhǎng)度)(7)SQRT函數(shù)返回指定float值的平方根:SQRT(浮點(diǎn)表達(dá)式)(8)SQUARE函數(shù)返回指定浮點(diǎn)值的平方:SQUARE(浮點(diǎn)表達(dá)式)任務(wù)7.3使用函數(shù)7.3.4日期函數(shù)(1)DATEADD函數(shù)返回給指定日期加上一個(gè)時(shí)間間隔(帶符號(hào)整數(shù))后所得到的新的日期時(shí)間值:DATEADD(日期部分,數(shù)字,日期)(2)DATEDIFF函數(shù)返回兩個(gè)日期之間的差值(帶符號(hào)整數(shù)):DATEDIFF(日期部分,起始日期,終止日期)(3)DATEPART函數(shù)返回一個(gè)整數(shù),表示指定日期中的指定部分:DATEPART(日期部分,日期)(4)DAY函數(shù)返回一個(gè)整數(shù),表示日期date中的“日”部分:DAY(日期)(5)GETDATE函數(shù)返回當(dāng)前數(shù)據(jù)庫系統(tǒng)時(shí)間戳作為datetime值:GETDATE()(6)MONTH函數(shù)返回表示指定日期中月份的整數(shù):MONTH(日期)(7)SYSDATETIME函數(shù)返回包含運(yùn)行SQLServer實(shí)例的計(jì)算機(jī)系統(tǒng)的日期和時(shí)間的datetime2值:SYSDATETIME()(8)YEAR函數(shù)返回一個(gè)整數(shù),表示指定日期的年份:YEAR(日期)任務(wù)7.3使用函數(shù)7.3.5轉(zhuǎn)換函數(shù)1.CAST函數(shù)CAST函數(shù)用于將某種數(shù)據(jù)類型的表達(dá)式顯式地轉(zhuǎn)換為另一種數(shù)據(jù)類型,語法格式如下。CAST(表達(dá)式AS數(shù)據(jù)類型[(長(zhǎng)度)])其中表達(dá)式參數(shù)指定要轉(zhuǎn)換其數(shù)據(jù)類型的表達(dá)式,可以是任何有效的表達(dá)式;數(shù)據(jù)類型指定要轉(zhuǎn)換的目標(biāo)數(shù)據(jù)類型,不能使用別名數(shù)據(jù)類型;長(zhǎng)度是一個(gè)可選整數(shù),用于指定目標(biāo)數(shù)據(jù)類型的長(zhǎng)度,默認(rèn)值為30。2.CONVERT函數(shù)若要指定轉(zhuǎn)換后數(shù)據(jù)的樣式,可使用CONVERT函數(shù)進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。語法格式如下。CONVERT(數(shù)據(jù)類型[(長(zhǎng)度)],表達(dá)式[,樣式])其中表達(dá)式、數(shù)據(jù)類型和長(zhǎng)度參數(shù)的含義與CAST函數(shù)中相應(yīng)參數(shù)相同。任務(wù)7.3使用函數(shù)7.3.6系統(tǒng)函數(shù)(1)@@ERROR函數(shù)返回執(zhí)行的上一個(gè)Transact-SQL語句的錯(cuò)誤號(hào):@@ERROR(2)@@IDENTITY函數(shù)返回最后插入的標(biāo)識(shí)值:@@IDENTITY(3)@@ROWCOUNT函數(shù)返回受上一語句影響的行數(shù):@@ROWCOUNT(4)@@SERVERNAME函數(shù)返回運(yùn)行SQLServer的本地服務(wù)器的名稱:@@SERVERNAME(5)@@SERVICENAME函數(shù)返回SQLServer正在其下運(yùn)行的注冊(cè)表項(xiàng)的名稱:@@SERVICENAME(6)@@VERSION函數(shù)返回當(dāng)前的SQLServer安裝的版本、處理器體系結(jié)構(gòu)、生成日期以及操作系統(tǒng):@@VERSION(7)DB_ID函數(shù)返回?cái)?shù)據(jù)庫標(biāo)識(shí)號(hào)(ID):DB_ID(['數(shù)據(jù)庫名稱'])(8)DB_NAME函數(shù)返回?cái)?shù)據(jù)庫名稱:DB_NAME([數(shù)據(jù)庫標(biāo)識(shí)號(hào)])(9)HOST_ID函數(shù)返回工作站標(biāo)識(shí)號(hào):HOST_ID()(10)HOST_NAME函數(shù)返回工作站名:HOST_NAME()(11)IDENT_CURRENT函數(shù)返回為指定的表或視圖生成的最后一個(gè)標(biāo)識(shí)值:IDENT_CURRENT('表名稱')(12)IDENT_INCR函數(shù)返回在表或視圖中創(chuàng)建標(biāo)識(shí)列時(shí)指定的增量值:IDENT_INCR('表或視圖')任務(wù)7.3使用函數(shù)7.3.6系統(tǒng)函數(shù)(13)IDENT_SEED函數(shù)返回在表或視圖中創(chuàng)建標(biāo)識(shí)列時(shí)指定的種子值:IDENT_SEED('表或視圖')(14)ISDATE函數(shù)確定輸入表達(dá)式是否為有效日期:ISDATE(表達(dá)式)(15)ISNULL函數(shù)使用指定的值來替換NULL值:ISNULL(待檢查表達(dá)式,替換表達(dá)式)(16)ISNUMERIC函數(shù)確定表達(dá)式是否為有效的數(shù)值類型:ISNUMERIC(表達(dá)式)(17)NEWID函數(shù)創(chuàng)建uniqueidentifier類型的唯一值:NEWID()(18)OBJECT_ID函數(shù)返回架構(gòu)范圍內(nèi)對(duì)象的數(shù)據(jù)庫對(duì)象標(biāo)識(shí)號(hào):OBJECT_ID('對(duì)象名稱'[,'對(duì)象類型'])(19)OBJECT_NAME函數(shù)返回架構(gòu)范圍內(nèi)對(duì)象的數(shù)據(jù)庫對(duì)象名稱:OBJECT_NAME(對(duì)象標(biāo)識(shí)號(hào))(20)SUSER_ID函數(shù)返回用戶的登錄標(biāo)識(shí)號(hào):SUSER_ID(['登錄名'])(21)SUSER_NAME函數(shù)返回用戶的登錄標(biāo)識(shí)名:SUSER_NAME([服務(wù)器用戶標(biāo)識(shí)號(hào)])(22)USER_ID函數(shù)返回?cái)?shù)據(jù)庫用戶的標(biāo)識(shí)號(hào):USER_ID(['用戶名'])(23)USER_NAME函數(shù)基于標(biāo)識(shí)號(hào)返回?cái)?shù)據(jù)庫用戶名:USER_NAME([標(biāo)識(shí)號(hào)])任務(wù)7.3使用函數(shù)7.3.7用戶定義函數(shù)1.用戶定義函數(shù)概述用戶定義函數(shù)是接受參數(shù)、執(zhí)行操作(例如復(fù)雜計(jì)算)并將操作結(jié)果以值的形式返回的例程。返回值可以是單個(gè)標(biāo)量值或結(jié)果集。使用用戶定義函數(shù)有以下優(yōu)點(diǎn):允許模塊化程序設(shè)計(jì),執(zhí)行速度更快,減少網(wǎng)絡(luò)流量。所有用戶定義函數(shù)都是由標(biāo)題和正文兩部分組成的。函數(shù)可以接受零個(gè)或多個(gè)輸入?yún)?shù),返回標(biāo)量值或表。標(biāo)題定義包括以下內(nèi)容:具有可選架構(gòu)/所有者名稱的函數(shù)名稱,輸入?yún)?shù)名稱和數(shù)據(jù)類型,可以用于輸入?yún)?shù)的選項(xiàng),返回參數(shù)數(shù)據(jù)類型和可選名稱,可以用于返回參數(shù)的選項(xiàng)。正文定義了函數(shù)將要執(zhí)行的操作或邏輯,可以是一個(gè)或多個(gè)Transact-SQL語句,或?qū)?NET程序集的引用。SQLServer2016支持以下四種類型的用戶定義函數(shù)。(1)標(biāo)量值函數(shù)(2)內(nèi)聯(lián)表值函數(shù)(3)多語句表值函數(shù)(4)CLR函數(shù)任務(wù)7.3使用函數(shù)7.3.7用戶定義函數(shù)2.創(chuàng)建用戶定義函數(shù)創(chuàng)建標(biāo)量值函數(shù)時(shí),CREATEFUNCTION語句的語法格式如下。CREATEFUNCTION[架構(gòu)名稱.]函數(shù)名稱([{@參數(shù)名稱[AS][類型構(gòu)架名稱.]參數(shù)數(shù)據(jù)類型[=默認(rèn)值]}[,...]])RETURNS返回值數(shù)據(jù)類型

[WITH[ENCRYPTION]|[SCHEMABINDING][,...]][AS]BEGIN

函數(shù)體

RETURN標(biāo)量表達(dá)式

END[;]3.調(diào)用用戶定義函數(shù)當(dāng)調(diào)用標(biāo)量值用戶定義函數(shù)時(shí),必須至少提供由架構(gòu)名稱和函數(shù)名稱兩部分組成的名稱。任務(wù)7.3使用函數(shù)7.3.7用戶定義函數(shù)4.修改用戶定義函數(shù)若要對(duì)用戶定義函數(shù)進(jìn)行修改,可使用SSMS來實(shí)現(xiàn),操作方法如下:在對(duì)象資源管理器中展開包含用戶定義函數(shù)的數(shù)據(jù)庫,在該數(shù)據(jù)庫下方依次展開“可編程性”和“函數(shù)”,右鍵單擊“標(biāo)量值函數(shù)”,然后選擇“修改”命令,此時(shí)會(huì)在SQL編輯器中生成一個(gè)ALTERFUNCTION語句;在這里對(duì)函數(shù)定義進(jìn)行修改,然后執(zhí)行ALTERFUNCTION語句。5.刪除用戶定義函數(shù)對(duì)于不再需要使用的用戶定義函數(shù),可以在對(duì)象資源管理器中將其從所在數(shù)據(jù)庫中刪除。操作方法是:在對(duì)象資源管理器中展開包含用戶定義函數(shù)的數(shù)據(jù)庫,在該數(shù)據(jù)庫下方依次展開“可編程性”、“函數(shù)”和“標(biāo)量值函數(shù)”(或“表值函數(shù)”)節(jié)點(diǎn),右鍵單擊要?jiǎng)h除的函數(shù)并選擇“刪除”,然后在“刪除對(duì)象”對(duì)話框中單擊“確定”按鈕。也可以使用DROPFUNCTION語句從當(dāng)前數(shù)據(jù)庫中刪除用戶定義函數(shù),語法格式如下。DROPFUNCTION{[架構(gòu)名稱.]函數(shù)名稱}[,...]任務(wù)7.3使用函數(shù)7.4.1理解游標(biāo)游標(biāo)通過以下方式來擴(kuò)展結(jié)果處理:允許定位在結(jié)果集的特定行;從結(jié)果集的當(dāng)前位置檢索一行或一部分行;支持對(duì)結(jié)果集中當(dāng)前位置的行進(jìn)行數(shù)據(jù)修改;為由其他用戶對(duì)顯示在結(jié)果集中的數(shù)據(jù)庫數(shù)據(jù)所做的更改提供不同級(jí)別的可見性支持;提供腳本、存儲(chǔ)過程和觸發(fā)器中使用的Transact-SQL語句,以訪問結(jié)果集中的數(shù)據(jù)。SQLServer支持兩種請(qǐng)求游標(biāo)的方法。Transact-SQL。在Transact-SQL中可以使用根據(jù)SQL-92游標(biāo)語法制定的游標(biāo)的語法。數(shù)據(jù)庫應(yīng)用程序編程接口(API)游標(biāo)函數(shù)。SQLServer支持?jǐn)?shù)據(jù)庫API的游標(biāo)功能,包括ADO(ActiveX數(shù)據(jù)對(duì)象)、OLEDB和ODBC(開放式數(shù)據(jù)庫連接)。本書中主要討論Transact-SQL游標(biāo)的使用方法。關(guān)于API游標(biāo),請(qǐng)參閱有關(guān)技術(shù)資料。任務(wù)7.4使用游標(biāo)7.4.2定義游標(biāo)1.SQL92語法DECLARE游標(biāo)名稱[INSENSITIVE][SCROLL]CURSORFORSELECT語句[FOR{READONLY|UPDATE[OF列名稱[,...]]}][;]2.Transact-SQL擴(kuò)展語法DECLARE游標(biāo)名稱CURSOR[LOCAL|GLOBAL][FORWARD_ONLY|SCROLL][STATIC|KEYSET|DYNAMIC|FAST_FORWARD][READ_ONLY|SCROLL_LOCKS|OPTIMISTIC][TYPE_WARNING]FORSELECT語句[FORUPDATE[OF列名稱[,...]]][;]任務(wù)7.4使用游標(biāo)7.4.3打開游標(biāo)使用OPEN語句打開Transact-SQL服務(wù)器游標(biāo):OPEN{{[GLOBAL]游標(biāo)名稱}|游標(biāo)變量名稱}其中GLOBAL指定游標(biāo)是全局游標(biāo)。游標(biāo)名稱指定已聲明游標(biāo)的名稱。如果全局游標(biāo)和局部游標(biāo)都使用該游標(biāo)名稱,則當(dāng)指定GLOBAL時(shí)指的是全局游標(biāo),否則指的是局部游標(biāo)。游標(biāo)變量名稱指定已聲明游標(biāo)變量的名稱,該變量引用一個(gè)游標(biāo)。打開游標(biāo)后可以使用@@ERROR函數(shù)來檢查打開操作是否成功:如果該函數(shù)返回0,則表明游標(biāo)打開成功,否則表明游標(biāo)打開失敗。還可以使用@@CURSOR_ROWS函數(shù)來獲取在連接上打開的上一個(gè)游標(biāo)中符合條件的行數(shù),其返回值為整數(shù)并且有以下四種可能。-m:游標(biāo)被異步填充。返回值(-m)是鍵集中當(dāng)前的行數(shù)。-1:游標(biāo)為動(dòng)態(tài)游標(biāo)。因?yàn)閯?dòng)態(tài)游標(biāo)可以反映所有更改,所以游標(biāo)符合條件的行數(shù)不斷變化。因此,永遠(yuǎn)不能確定已檢索到所有符合條件的行。0:目前沒有已打開的游標(biāo),對(duì)于上一個(gè)打開的游標(biāo)沒有符合條件的行或上一個(gè)打開的游標(biāo)已被關(guān)閉或被釋放。n:游標(biāo)已完全填充。返回值(n)是游標(biāo)中的總行數(shù)。任務(wù)7.4使用游標(biāo)7.4.4通過游標(biāo)提取數(shù)據(jù)使用FETCH語句從該游標(biāo)中檢索特定的行:FETCH[[NEXT|PRIOR|FIRST|LAST|ABSOLUTE{n|@nvar}|RELATIVE{n|@nvar}]FROM]{{[GLOBAL]游標(biāo)名稱}|@游標(biāo)變量名稱}[INTO@變量名稱[,...]]任務(wù)7.4使用游標(biāo)7.4.5通過游標(biāo)更新數(shù)據(jù)如果希望要在通過Transcact-SQL服務(wù)器游標(biāo)提取某行后修改或刪除該行,可以先定義一個(gè)可更新的游標(biāo),即在游標(biāo)定義語句中指定FORUPDATE子句。如果需要,還可以指定要更新哪些列。定義可更新游標(biāo)后,可以在UPDATE或DELETE語句中使用一個(gè)WHERECURRENTOF<游標(biāo)>子句,從而對(duì)游標(biāo)當(dāng)前所指向的數(shù)據(jù)行進(jìn)行修改或刪除。7.4.6關(guān)閉和釋放游標(biāo)1.關(guān)閉游標(biāo)CLOSE{{[GLOBAL]游標(biāo)名稱}|游標(biāo)變量名稱}2.釋放游標(biāo)DEALLOCATE{{[GLOBAL]游標(biāo)名稱}|@游標(biāo)變量名稱}任務(wù)7.4使用游標(biāo)7.5.1事務(wù)概述一個(gè)邏輯工作單元要成為一個(gè)事務(wù),必須具有ACID四個(gè)屬性,即原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability)。(1)原子性。事務(wù)必須是原子工作單元;在一個(gè)事務(wù)中所做的數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。(2)一致性。事務(wù)在完成時(shí),必須使所有的數(shù)據(jù)都保持一致狀態(tài)。(3)隔離性。由并發(fā)事務(wù)所作的修改必須與任何其他并發(fā)事務(wù)所作的修改隔離。(4)持久性。事務(wù)完成之后,它對(duì)于系統(tǒng)的影響是永久性的。任務(wù)7.5處理事務(wù)7.5.2編寫有效事務(wù)要編寫有效事務(wù),應(yīng)遵循以下指導(dǎo)原則。(1)不要在事務(wù)處理期間要求用戶輸入。(2)瀏覽數(shù)據(jù)時(shí)盡量不要打開事務(wù),在所有預(yù)備數(shù)據(jù)分析完成之前建議不要啟動(dòng)事務(wù)。(3)盡可能使事務(wù)保持簡(jiǎn)短。(4)考慮為只讀查詢使用快照隔離,以減少阻塞。(5)靈活地使用更低的事務(wù)隔離級(jí)別。(6)靈活地使用更低的游標(biāo)并發(fā)選項(xiàng)。(7)在事務(wù)中盡量使訪問的數(shù)據(jù)量最小,以減少鎖定的行數(shù),并減少事務(wù)之間的爭(zhēng)奪。任務(wù)7.5處理事務(wù)7.5.3啟動(dòng)事務(wù)在Transcact-SQL中,可以使用BEGINTRANSACTION語句標(biāo)記一個(gè)顯式本地事務(wù)的起始點(diǎn),該語句使@@TRANCOUNT按1遞增,語法格式如下。BEGIN{TRAN|TRANSACTION}[{事務(wù)名稱|@事務(wù)名稱變量}[WITHMARK['描述']]][;]其中事務(wù)名稱指定分配給事務(wù)的名稱,必須符合標(biāo)識(shí)符規(guī)則,包含的字符數(shù)不能大于32。僅在最外面的BEGIN...COMMIT或BEGIN...ROLLBACK嵌套語句對(duì)中使用事務(wù)名稱。@事務(wù)名稱變量表示用戶定義的、含有有效事務(wù)名

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論