【正文】
?向存儲過程傳遞參數(shù) 存儲過程聲明中可以包含參數(shù),作為存儲過程和調(diào)用者之間交換數(shù)據(jù)的一種方法。所屬的城市信息會隨時間變化?,F(xiàn)網(wǎng)絡(luò)擁塞,為減少網(wǎng)絡(luò)通信量,可采用存儲過程來實現(xiàn)該查詢。 創(chuàng)建存儲過程 ? 創(chuàng)建存儲過程語法 : CREATE PROCEDURE proc_name AS BEGIN sql_statement1 sql_statement2 END ? 雖然在設(shè)計存儲過程時,可以包含任意數(shù)據(jù)和類型的 SQL語句,但是下表列出的語句在設(shè)計存儲過程時不能使用。擴(kuò)展存儲過程允許以其他語言 (如 C)創(chuàng)建自己的外部存儲過程,其內(nèi)容并不存在 SQL SERVER中,而是以 DLL形式單獨存在。 ? 存儲過程的類型 ? :系統(tǒng)存儲過程一般以 “ sp_”為前綴,是由 SQL SERVER自己創(chuàng)建、管理和使用的一種特殊存儲過程,不需對其修改和刪除。 ? :用戶可以授權(quán)執(zhí)行存儲過程,盡管他們不擁有該過程。 ? 存儲過程的優(yōu)點 (續(xù) ) ? :存儲過程在創(chuàng)建完畢后,可以在程序中多次被調(diào)用,而不必重新編寫該 SQL語句。 ? 存儲過程的優(yōu)點 ? :因為 SQL SERVER會事先將存儲過程編譯成二進(jìn)制可執(zhí)行代碼,在運行時, SQL SERVER不需要再對存儲過程進(jìn)行編譯,可以加快執(zhí)行速度。 end from sc ?SQL SERVER存儲過程 ? 創(chuàng)建存儲過程 ? 執(zhí)行存儲過程 ? 向存儲過程傳遞參數(shù) ? 修改存儲過程 ? 從存儲過程返回值 ? 從存儲過程返回多個值 ? 存儲過程調(diào)用另一個存儲過程 ? 重編譯存儲過程 ? 刪除存儲過程 ? 存儲過程 —— 存儲過程是一組預(yù)先寫好的能實現(xiàn)某種功能的SQL程序,指定一個程序名并由 SQL SERVER編譯后將其存在 SQL SERVER中,以后要實現(xiàn)該功能,則可以調(diào)用這個程序來完成。 else 39。 when grade=60 and grade70 then 39。 when grade=70 and grade80 then 39。 when grade=80 and grade90 then 39。打印格式示例如圖: select sno,o,grade,分析結(jié)果 = case when grade=90 then 39。 when sgender=‘女 ’ then ‘girl’ else ‘未知 39。張三是個 39。not known39。girl39。女 39。boy39。男 39。張三 39。 DECLARE mark int SELECT mark=grade FROM SC WHERE Sno=‘95001’ AND Cno=‘1000’ IF mark60 PRINT ‘學(xué)生 95001的 1000號課程不及格 ’ ELSE BEGIN IF mark=60 and mark80 PRINT ‘學(xué)生 95001的 1000號課程成績及格 ’ ELSE PRINT ‘學(xué)生 95001的 1000號課程成績良好 ’ END ? CASE語句 CASE語法: CASE input_expression WHEN when_expression THEN result_expression [… n] [ ELSE else_result_expression ] END ? CASE語句 CASE語法: CASE WHEN boolean_expression THEN result_expression [… n] [ ELSE else_result_expression ] END 在簡單的 case語法代碼中,系統(tǒng)會將 input_expression的值與每一個 when_expression的值作比較,如果相同的話,返回then語句之后的表達(dá)式,如果和所有 when_expression的值都不相等的話,返回 else之后的表達(dá)式,如果沒有 else語句,則返回null。 DECLARE count int DECLARE sum int SET count=1 SET sum=0 WHILE count=100 BEGIN SELECT sum=sum+count SELECT count=count+1 END PRINT ‘1到 100的累加和 = ’+CONVERT(CHAR(4),sum) ? CASE語句 CASE語句也是條件判斷語句的一種,可以完成比 IF語句更強(qiáng)的判斷。 break語句是跳出目前所執(zhí)行的循環(huán), continue種植執(zhí)行代碼,跳回到 while的判斷語句重新進(jìn)行條件判斷,再根據(jù)判斷結(jié)果決定是否進(jìn)入循環(huán)。語法如下: WHILE Boolean_expression { sql_statement|statement_block } { BREAK } { sql_statement|statement_block } { CONTINUE } { sql_statement|statement_block } WHILE語句語法解釋: 當(dāng) boolean_expression為 true時,循環(huán)執(zhí)行 while語句塊的代碼,直到 boolean_expression為 false為止。編寫一個批量,對于職工號為 000008的員工,如果他的測試成績高于 80分,則打印消息 ‘ Called for interview’ 和測試成績,否則,打印消息 ‘ RejectedNot called for interview’。否則,打印消息 ‘ Employee not found! ’ IF EXISTS( SELECT * FROM Employee WHERE vFirstName=‘Angela’) BEGIN PRINT ‘The detail of the employee: ’ SELECT * FROM Employee WHERE vFirstName=‘Angela’ END ELSE PRINT ‘Employee not found!’ ? 例子:如果合同招聘人員的平均費用 (siPercentageCharge)低于 20,那么所有合同招聘人員的 siPercentageCharge增加 5,否則只增加 3。語法: IF boolean_expression {sql_statement|statement_block} [ELSE boolean_expression] {sql_statement|statement_block} ? boolean_expression 是一個求值 TRUE或 FALSE的表達(dá)式 ? sql_statement是任意 SQL語句 ? statement_block是一組 SQL語句 ? BEGIN… END語句 BEGIN… END通常是用來表示一個語句塊,其內(nèi)可以包含一組TSQL語句,凡是在這個語句塊里的所有代碼,都屬于同一個控制流。編寫一個批量,對于職工號為 000008的員工,如果他的測試成績高于 80分,則打印消息 ‘ Called for interview’ 和測試成績,否則,打印消息 ‘ RejectedNot called for interview’??刂屏髡Z句使得標(biāo)準(zhǔn) SQL具備了編程語言的能力。 注釋入口有兩種方式: ? 單行注釋入口 (兩個連字符 )開始 ? 多行注釋入口包含在 /* 和 */之間 ? 控制流語句 控制流語句控制批量、存儲過程、觸發(fā)器和事務(wù)中 SQL語句的執(zhí)行流程。兩者有細(xì)微的差別。 ? 全局變量以兩個 符號最為前綴 ,它們是由服務(wù)器聲明的、通常由服務(wù)器賦值的變量。變量用 DECLARE聲明,語法如下: DECLARE variable_name data_type ? 注意在變量符號前的 符號 這個符號是必須的,查詢處理器用其來識別變量; ? 變量的賦值可以使用 SET或 SELECT賦值,其中 SET用于給變量賦予某個具體的值, SELECT可通過查詢將表中列的值賦給變量; ? 局部變量的生存期只在一個批量里; ? 例子:聲明變量并賦值 ① DECLARE x int SET x=100 ② DECLARE charge int SELECT charge=MAX(siPercentageCharge) FROM ContractRecruiter ③ DECLARE charge float SELECT charge=siPercentageCharge FROM ContractRecruiter ? 變量 —— 在 SQL SERVER中有兩類變量:局部變量和全局變量 ? 局部變量以一個 開頭,在批量中聲明,當(dāng)批量執(zhí)行完后它就丟失。如果批量中有語法錯誤,那么批量中沒有語句被執(zhí)行。 批量被分析、優(yōu)化、編譯和執(zhí)行。) ? 例: 有如下視圖 CREATE VIEW vwEmployeeCandidate AS SELECT ,vFirstName, vLastName,cPhone,siTestScore FROM Employee AS E JOIN InternalCandidate AS I ON = ? 續(xù)上例,對該視圖進(jìn)行更新,更新候選人代碼為‘ 000018’ 的測試成績和電話號碼,寫出如下的更新語句: UPDATE vwEmployeeCandidate SET cPhone=‘(614)3245634’,siTestScore=75 WHERE cCanidateCode=‘000018’ 該語句執(zhí)行時會產(chǎn)生一個錯誤!原因是:視圖只允許一次更新一個基表。 ? 連接 視圖 的更新 ? 連接視圖 由多個表連接構(gòu)成的視圖。 該項的默認(rèn)值為 0,表示將葉子節(jié)點索引頁填滿,等于 100%。 CREATE NONCLUSTERED INDEX idxitemno ON test1(itemno DESC) 或者 CREATE INDEX idxitemno ON test1(itemno DESC) ? 索引的刪除 ? 語法 DROP INDEX ? 使用索引調(diào)節(jié)向?qū)В▽嵗f明) 已經(jīng)在 Department表中創(chuàng)建了以下索引: CREATE NONCLUSTERED INDEX idxdepcode ON Department(cDepartmentCode) CREATE NONCLUSTERED INDEX idxdepname ON Department(vDepartmentName) CREATE NONCLUSTERED INDEX idxdephead ON Department(vDepartmentHead) CREATE NONCLUSTERED INDEX idxdeplocation ON Department(vLocation) 執(zhí)行下列查詢,分析 Department表中索引的使用情況: SELECT , ,vDepartmentName FROM Position JOIN Requisition ON = JOIN Department ON = ? 使用索引調(diào)節(jié)向?qū)В▽嵗f明) 已經(jīng)在 Department表中創(chuàng)建了以下索引: CREATE NONCLUSTERED INDEX idxdepcode ON Department(cDepartmentCode) CREATE NONCLUSTERED INDEX idxdepname ON Department(vDepartmentName) CREATE NONCLUSTERED INDEX idxdephead ON Department(vDepartmentHead) CREATE NONCLUSTERED INDEX idxdeplocation ON Department(vLocation) ? 索引 ENHANCEMENTS Fill Factor(填充因子 ) 填充因子是指在創(chuàng)建索引頁時,每個葉子節(jié)點的填入數(shù)據(jù)的填滿率。 ? 例子:在表 test1上,要求索引表中的值按照 itemno列的值的降序排列原則,創(chuàng)建一個聚集索引。只邏輯地組織數(shù)據(jù); ? idxname指出創(chuàng)建的索引名稱。索引對具有大量重復(fù)數(shù)據(jù)的列沒有多大用處; ? 當(dāng)修改索引列的數(shù)據(jù)時,相關(guān)索引會被