當前位置:首頁 » 編程語言 » sql的過程描述
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql的過程描述

發布時間: 2022-07-12 15:03:26

sql 中的存儲過程誰能描述下下··謝謝

標准答案:
在最新的SQL2005中的存儲過程(Procere)類似於java語言中的方法,它是SQL語句和控制流語句的預編譯集合。存儲過程在資料庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變數,邏輯控制語句以及其他強大的編程功能。
存儲過程可包含邏輯控制語句和數據操作語句,它可以接收參數,輸出參數,返回單個或多個結果集以及返回值。
給你一個例子:
create proc proc_takeMoney
@cardID1 varchar(20), --匯款賬號
@pwd int , --匯款密碼
@takeMoney money, --匯款金額
@cardID2 varchar(20) --存款賬號
as
set nocount on
declare @err int
set @err = 0
if exists(select 1 from cardInfo where cardID = @cardID1 and pass = @pwd)
begin
begin tran --事物開始
update cardInfo set balance = balance + @takeMoney where cardID = @cardID2 --接受款帳戶加上@takeMoney
set @err = @err + @@error
update cardInfo set balance = balance - @takeMoney where cardID = @cardID1 --匯款帳戶減去@takeMoney
set @err = @err + @@error
/*--交易信息表插入交易信息--*/
insert into transInfo(transDate,cardId,transType,transMoney) values(default,@cardID1,'支取',@takeMoney)
set @err = @err + @@error
insert into transInfo(transDate,cardId,transType,transMoney) values(default,@cardID2,'存入',@takeMoney)
set @err = @err + @@error
/*--交易信息--*/
select top 2 * from transInfo order by transDate desc
if(@err<>0)
begin
rollback tran --錯誤回滾事物
end
else
begin
commit tran --無錯誤提交事物
end
end --if結束
else
begin
print '密碼錯誤'
end

/*--調用存儲過程--*/
declare @cardID1 varchar(20),@cardID2 varchar(20),@pwd int ,@takeMoney money
set @cardID1 ='1010 3576 1234 5678' --張三卡號
set @pwd = 888888 --張三密碼
set @cardID2 ='1010 3576 1212 1134' --李四卡號
set @takeMoney =20 --匯款金額

exec proc_takeMoney @cardID1 ,@pwd,@takeMoney,@cardID2

⑵ SQL語句執行過程詳解

SQL語句執行過程詳解
一條sql,plsql的執行到底是怎樣執行的呢?
一、SQL語句執行原理:
第一步:客戶端把語句發給伺服器端執行當我們在客戶端執行 select 語句時,客戶端會把這條 SQL 語句發送給伺服器端,讓伺服器端的
進程來處理這語句。也就是說,Oracle 客戶端是不會做任何的操作,他的主要任務就是把客戶端產生
的一些 SQL 語句發送給伺服器端。雖然在客戶端也有一個資料庫進程,但是,這個進程的作用跟伺服器
上的進程作用事不相同的。伺服器上的資料庫進程才會對SQL 語句進行相關的處理。不過,有個問題需
要說明,就是客戶端的進程跟伺服器的進程是一一對應的。也就是說,在客戶端連接上伺服器後,在客戶
端與伺服器端都會形成一個進程,客戶端上的我們叫做客戶端進程;而伺服器上的我們叫做伺服器進程。
第二步:語句解析
當客戶端把 SQL 語句傳送到伺服器後,伺服器進程會對該語句進行解析。同理,這個解析的工作,
也是在伺服器端所進行的。雖然這只是一個解析的動作,但是,其會做很多「小動作」。
1. 查詢高速緩存(library cache)。伺服器進程在接到客戶端傳送過來的 SQL 語句時,不
會直接去資料庫查詢。而是會先在資料庫的高速緩存中去查找,是否存在相同語句的執行計劃。如果在
數據高速緩存中,則伺服器進程就會直接執行這個 SQL 語句,省去後續的工作。所以,採用高速數據緩
存的話,可以提高 SQL 語句的查詢效率。一方面是從內存中讀取數據要比從硬碟中的數據文件中讀取
數據效率要高,另一方面,也是因為這個語句解析的原因。
不過這里要注意一點,這個數據緩存跟有些客戶端軟體的數據緩存是兩碼事。有些客戶端軟體為了
提高查詢效率,會在應用軟體的客戶端設置數據緩存。由於這些數據緩存的存在,可以提高客戶端應用軟
件的查詢效率。但是,若其他人在伺服器進行了相關的修改,由於應用軟體數據緩存的存在,導致修改的
數據不能及時反映到客戶端上。從這也可以看出,應用軟體的數據緩存跟資料庫伺服器的高速數據緩存
不是一碼事。
2. 語句合法性檢查(data dict cache)。當在高速緩存中找不到對應的 SQL 語句時,則服
務器進程就會開始檢查這條語句的合法性。這里主要是對 SQL 語句的語法進行檢查,看看其是否合乎
語法規則。如果伺服器進程認為這條 SQL 語句不符合語法規則的時候,就會把這個錯誤信息,反饋給客
戶端。在這個語法檢查的過程中,不會對 SQL 語句中所包含的表名、列名等等進行 SQL 他只是語法
上的檢查。
3. 語言含義檢查(data dict cache)。若 SQL 語句符合語法上的定義的話,則伺服器進程
接下去會對語句中的欄位、表等內容進行檢查。看看這些欄位、表是否在資料庫中。如果表名與列名不
准確的話,則資料庫會就會反饋錯誤信息給客戶端。所以,有時候我們寫 select 語句的時候,若語法
與表名或者列名同時寫錯的話,則系統是先提示說語法錯誤,等到語法完全正確後,再提示說列名或表名
錯誤。
4. 獲得對象解析鎖(control structer)。當語法、語義都正確後,系統就會對我們需要查詢
的對象加鎖。這主要是為了保障數據的一致性,防止我們在查詢的過程中,其他用戶對這個對象的結構發
生改變。
5. 數據訪問許可權的核對(data dict cache)。當語法、語義通過檢查之後,客戶端還不一定
能夠取得數據。伺服器進程還會檢查,你所連接的用戶是否有這個數據訪問的許可權。若你連接上伺服器
的用戶不具有數據訪問許可權的話,則客戶端就不能夠取得這些數據。有時候我們查詢數據的時候,辛辛苦
苦地把 SQL 語句寫好、編譯通過,但是,最後系統返回個 「沒有許可權訪問數據」的錯誤信息,讓我們氣
半死。這在前端應用軟體開發調試的過程中,可能會碰到。所以,要注意這個問題,資料庫伺服器進程先
檢查語法與語義,然後才會檢查訪問許可權。
6. 確定最佳執行計劃 ?。當語句與語法都沒有問題,許可權也匹配的話,伺服器進程還是不會直接對
資料庫文件進行查詢。伺服器進程會根據一定的規則,對這條語句進行優化。不過要注意,這個優化是有
限的。一般在應用軟體開發的過程中,需要對資料庫的 sql 語言進行優化,這個優化的作用要大大地大
於伺服器進程的自我優化。所以,一般在應用軟體開發的時候,資料庫的優化是少不了的。當伺服器進程
的優化器確定這條查詢語句的最佳執行計劃後,就會將這條 SQL 語句與執行計劃保存到數據高速緩存
(library cache)。如此的話,等以後還有這個查詢時,就會省略以上的語法、語義與許可權檢查的步驟,
而直接執行 SQL 語句,提高 SQL 語句處理效率。
第三步:語句執行
語句解析只是對 SQL 語句的語法進行解析,以確保伺服器能夠知道這條語句到底表達的是什麼意
思。等到語句解析完成之後,資料庫伺服器進程才會真正的執行這條 SQL 語句。這個語句執行也分兩
種情況。
一是若被選擇行所在的數據塊已經被讀取到數據緩沖區的話,則伺服器進程會直接把這個數據傳遞
給客戶端,而不是從資料庫文件中去查詢數據。
若數據不在緩沖區中,則伺服器進程將從資料庫文件中查詢相關數據,並把這些數據放入到數據緩沖
區中(buffer cache)。
第四步:提取數據
當語句執行完成之後,查詢到的數據還是在伺服器進程中,還沒有被傳送到客戶端的用戶進程。所以,
在伺服器端的進程中,有一個專門負責數據提取的一段代碼。他的作用就是把查詢到的數據結果返回給
用戶端進程,從而完成整個查詢動作。從這整個查詢處理過程中,我們在資料庫開發或者應用軟體開發過
程中,需要注意以下幾點:
一是要了解資料庫緩存跟應用軟體緩存是兩碼事情。資料庫緩存只有在資料庫伺服器端才存在,在
客戶端是不存在的。只有如此,才能夠保證資料庫緩存中的內容跟資料庫文件的內容一致。才能夠根據
相關的規則,防止數據臟讀、錯讀的發生。而應用軟體所涉及的數據緩存,由於跟資料庫緩存不是一碼事
情,所以,應用軟體的數據緩存雖然可以提高數據的查詢效率,但是,卻打破了數據一致性的要求,有時候
會發生臟讀、錯讀等情況的發生。所以,有時候,在應用軟體上有專門一個功能,用來在必要的時候清除
數據緩存。不過,這個數據緩存的清除,也只是清除本機上的數據緩存,或者說,只是清除這個應用程序
的數據緩存,而不會清除資料庫的數據緩存。
二是絕大部分 SQL 語句都是按照這個處理過程處理的。我們 DBA 或者基於 Oracle 資料庫的
開發人員了解這些語句的處理過程,對於我們進行涉及到 SQL 語句的開發與調試,是非常有幫助的。有
時候,掌握這些處理原則,可以減少我們排錯的時間。特別要注意,資料庫是把數據查詢許可權的審查放在
語法語義的後面進行檢查的。所以,有時會若光用資料庫的許可權控制原則,可能還不能滿足應用軟體許可權
控制的需要。此時,就需要應用軟體的前台設置,實現許可權管理的要求。而且,有時應用資料庫的許可權管
理,也有點顯得繁瑣,會增加伺服器處理的工作量。因此,對於記錄、欄位等的查詢許可權控制,大部分程
序涉及人員喜歡在應用程序中實現,而不是在資料庫上實現。
DBCC DROPCLEANBUFFERS
從緩沖池中刪除所有清除緩沖區。
DBCC FREEPROCCACHE
從過程緩存中刪除所有元素。
DBCC FREESYSTEMCACHE
從所有緩存中釋放所有未使用的緩存條目
SQL語句中的函數、關鍵字、排序等執行順序:
1. FROM 子句返回初始結果集。
2. WHERE 子句排除不滿足搜索條件的行。
3. GROUP BY 子句將選定的行收集到 GROUP BY 子句中各個唯一值的組中。
4. 選擇列表中指定的聚合函數可以計算各組的匯總值。
5. 此外,HAVING 子句排除不滿足搜索條件的行。
6. 計算所有的表達式;
7. 使用 order by 對結果集進行排序。
8. 查找你要搜索的欄位。
二、SQL語句執行完整過程:
1.用戶進程提交一個 sql 語句:
update temp set a=a*2,給伺服器進程。
2.伺服器進程從用戶進程把信息接收到後,在 PGA 中就要此進程分配所需內存,存儲相關的信息,如在會
話內存存儲相關的登錄信息等。
3.伺服器進程把這個 sql 語句的字元轉化為 ASCII 等效數字碼,接著這個 ASCII 碼被傳遞給一個
HASH 函數,並返回一個 hash 值,然後伺服器進程將到shared pool 中的 library cache 中去查找是否存在相
同的 hash 值,如果存在,伺服器進程將使用這條語句已高速緩存在 SHARED POOL 的library cache 中的已
分析過的版本來執行。
4.如果不存在,伺服器進程將在 CGA 中,配合 UGA 內容對 sql,進行語法分析,首先檢查語法的正確性,接
著對語句中涉及的表,索引,視圖等對象進行解析,並對照數據字典檢查這些對象的名稱以及相關結構,並根據
ORACLE 選用的優化模式以及數據字典中是否存在相應對象的統計數據和是否使用了存儲大綱來生成一個
執行計劃或從存儲大綱中選用一個執行計劃,然後再用數據字典核對此用戶對相應對象的執行許可權,最後生成
一個編譯代碼。
5.ORACLE 將這條 sql 語句的本身實際文本、HASH 值、編譯代碼、與此語名相關聯的任何統計數據
和該語句的執行計劃緩存在 SHARED POOL 的 library cache中。伺服器進程通過 SHARED POOL 鎖存
器(shared pool latch)來申請可以向哪些共享 PL/SQL 區中緩存這此內容,也就是說被SHARED POOL 鎖存
器鎖定的 PL/SQL 區中的塊不可被覆蓋,因為這些塊可能被其它進程所使用。
6.在 SQL 分析階段將用到 LIBRARY
CACHE,從數據字典中核對表、視圖等結構的時候,需要將數據
字典從磁碟讀入 LIBRARY
CACHE,因此,在讀入之前也要使用LIBRARY
CACHE 鎖存器(library cache
pin,library cache lock)來申請用於緩存數據字典。 到現在為止,這個 sql 語句已經被編譯成可執行的代碼了,
但還不知道要操作哪些數據,所以伺服器進程還要為這個 sql 准備預處理數據。
7.首先伺服器進程要判斷所需數據是否在 db buffer 存在,如果存在且可用,則直接獲取該數據,同時根據
LRU 演算法增加其訪問計數;如果 buffer 不存在所需數據,則要從數據文件上讀取首先伺服器進程將在表頭部
請求 TM 鎖(保證此事務執行過程其他用戶不能修改表的結構),如果成功加 TM 鎖,再請求一些行級鎖(TX
鎖),如果 TM、TX 鎖都成功加鎖,那麼才開始從數據文件讀數據,在讀數據之前,要先為讀取的文件准備好
buffer 空間。伺服器進程需要掃面 LRU list 尋找 free db buffer,掃描的過程中,伺服器進程會把發現的所有
已經被修改過的 db buffer 注冊到 dirty list 中, 這些 dirty buffer 會通過 dbwr 的觸發條件,隨後會被寫出到
數據文件,找到了足夠的空閑 buffer,就可以把請求的數據行所在的數據塊放入到 db buffer 的空閑區域或者
覆蓋已經被擠出 LRU list 的非臟數據塊緩沖區,並排列在 LRU list 的頭部,也就是在數據塊放入 DB
BUFFER 之前也是要先申請 db buffer 中的鎖存器,成功加鎖後,才能讀數據到 db buffer。
8.記日誌 現在數據已經被讀入到 db buffer 了,現在伺服器進程將該語句所影響的並被讀
入 db buffer 中的這些行數據的 rowid 及要更新的原值和新值及 scn 等信息從 PGA 逐條的寫入 redo log
buffer 中。在寫入 redo log buffer 之前也要事先請求 redo log buffer 的鎖存器,成功加鎖後才開始寫入,當
寫入達到 redo log buffer 大小的三分之一或寫入量達到 1M 或超過三秒後或發生檢查點時或者 dbwr 之前
發生,都會觸發 lgwr 進程把 redo log buffer 的數據寫入磁碟上的 redo file 文件中(這個時候會產生log file
sync 等待事件)
已經被寫入 redofile 的 redo log buffer 所持有的鎖存器會被釋放,並可被後來的寫入信息覆蓋,
redo log buffer是循環使用的。Redo file 也是循環使用的,當一個 redo file 寫滿後,lgwr 進程會自動切換到
下一 redo file(這個時候可能出現 log fileswitch(checkpoint complete)等待事件)。如果是歸檔模式,歸檔進
程還要將前一個寫滿的 redo file 文件的內容寫到歸檔日誌文件中(這個時候可能出現 log file
switch(archiving needed)。
9.為事務建立回滾段 在完成本事務所有相關的 redo log buffer 之後,伺服器進程開始改寫這個 db buffer
的塊頭部事務列表並寫入 scn,然後 包含這個塊的頭部事務列表及 scn 信息的數據副本放入回滾段中,將
這時回滾段中的信息稱為數據塊的「前映像「,這個」前映像「用於以後的回滾、恢復和一致性讀。(回滾段可以
存儲在專門的回滾表空間中,這個表空間由一個或多個物理文件組成,並專用於回滾表空間,回滾段也可在其它
表空間中的數據文件中開辟。
10.本事務修改數據塊 准備工作都已經做好了,現在可以改寫 db buffer 塊的數據內容了,並在塊的頭部寫
入回滾段的地址。
11.放入 dirty list 如果一個行數據多次 update 而未 commit,則在回滾段中將會有多個「前映像「,除了第
一個」前映像「含有 scn 信息外,其他每個「前映像「的頭部都有 scn 信息和「前前映像」回滾段地址。一個
update 只對應一個 scn,然後伺服器進程將在 dirty list 中建立一
條指向此 db buffer 塊的指針(方便 dbwr 進程可以找到 dirty list 的 db buffer 數據塊並寫入數據文件中)。
接著伺服器進程會從數據文件中繼續讀入第二個數據塊,重復前一數據塊的動作,數據塊的讀入、記日誌、建
立回滾段、修改數據塊、放入 dirty list。當 dirty queue 的長度達到閥值(一般是 25%),伺服器進程將通知
dbwr 把臟數據寫出,就是釋放 db buffer 上的鎖存器,騰出更多的 free db buffer。前面一直都是在說明
oracle 一次讀一個數據塊,其實 oracle 可以一次讀入多個數據塊(db_file_multiblock_read_count 來設置一
次讀入塊的個數)
說明:
在預處理的數據已經緩存在 db buffer 或剛剛被從數據文件讀入到 db buffer 中,就要根據 sql 語句
的類型來決定接下來如何操作。
1>如果是 select 語句,則要查看 db buffer 塊的頭部是否有事務,如果有事務,則從回滾段中讀取數據;如
果沒有事務,則比較 select 的 scn 和 db buffer 塊頭部的 scn,如果前者小於後者,仍然要從回滾段中讀取數據;
如果前者大於後者,說明這是一非臟緩存,可以直接讀取這個 db buffer 塊的中內容。
2>如果是 DML 操作,則即使在 db buffer 中找到一個沒有事務,而且 SCN 比自己小的非臟
緩存數據塊,伺服器進程仍然要到表的頭部對這條記錄申請加鎖,加鎖成功才能進行後續動作,如果不成功,則要
等待前面的進程解鎖後才能進行動作(這個時候阻塞是 tx 鎖阻塞)。
用戶 commit 或 rollback 到現在為止,數據已經在 db buffer 或數據文件中修改完
成,但是否要永久寫到數文件中,要由用戶來決定 commit(保存更改到數據文件) rollback 撤銷數據的更改)。
1.用戶執行 commit 命令
只有當 sql 語句所影響的所有行所在的最後一個塊被讀入 db buffer 並且重做信息被寫入 redo log
buffer(僅指日誌緩沖區,而不包括日誌文件)之後,用戶才可以發去 commit 命令,commit 觸發 lgwr 進程,但不
強制立即 dbwr來釋放所有相應 db buffer 塊的鎖(也就是no-force-at-commit,即提交不強制寫),也就是說有
可能雖然已經 commit 了,但在隨後的一段時間內 dbwr 還在寫這條 sql 語句所涉及的數據塊。表頭部的行鎖
並不在 commit 之後立即釋放,而是要等 dbwr 進程完成之後才釋放,這就可能會出現一個用戶請求另一用戶
已經 commit 的資源不成功的現象。
A .從 Commit 和 dbwr 進程結束之間的時間很短,如果恰巧在 commit 之後,dbwr 未結束之前斷電,因為
commit 之後的數據已經屬於數據文件的內容,但這部分文件沒有完全寫入到數據文件中。所以需要前滾。由
於 commit 已經觸發 lgwr,這些所有未來得及寫入數據文件的更改會在實例重啟後,由 smon 進程根據重做日
志文件來前滾,完成之前 commit 未完成的工作(即把更改寫入數據文件)。
B.如果未 commit 就斷電了,因為數據已經在 db buffer 更改了,沒有 commit,說明這部分數據不屬於數
據文件,由於 dbwr 之前觸發 lgwr 也就是只要數據更改,(肯定要先有 log) 所有 DBWR,在數據文件上的修改
都會被先一步記入重做日誌文件,實例重啟後,SMON 進程再根據重做日誌文件來回滾。
其實 smon 的前滾回滾是根據檢查點來完成的,當一個全部檢查點發生的時候,首先讓 LGWR 進程將
redo log buffer 中的所有緩沖(包含未提交的重做信息)寫入重做日誌文件,然後讓 dbwr 進程將 db buffer 已
提交的緩沖寫入數據文件(不強制寫未提交的)。然後更新控制文件和數據文件頭部的 SCN,表明當前資料庫
是一致的,在相鄰的兩個檢查點之間有很多事務,有提交和未提交的。
像前面的前滾回滾比較完整的說法是如下的說明:

A.發生檢查點之前斷電,並且當時有一個未提交的改變正在進行,實例重啟之後,SMON 進程將從上一個
檢查點開始核對這個檢查點之後記錄在重做日誌文件中已提交的和未提交改變,因為
dbwr 之前會觸發 lgwr,所以 dbwr 對數據文件的修改一定會被先記錄在重做日誌文件中。因此,斷電前被
DBWN 寫進數據文件的改變將通過重做日誌文件中的記錄進行還原,叫做回滾,
B. 如果斷電時有一個已提交,但 dbwr 動作還沒有完全完成的改變存在,因為已經提交,提交會觸發 lgwr
進程,所以不管 dbwr 動作是否已完成,該語句將要影響的行及其產生的結果一定已經記錄在重做日誌文件中
了,則實例重啟後,SMON 進程根據重做日誌文件進行前滾.
實例失敗後用於恢復的時間由兩個檢查點之間的間隔大小來決定,可以通個四個參數設置檢查點執行的頻
率:

Log_checkpoint_interval:
決定兩個檢查點之間寫入重做日誌文件的系統物理塊(redo blocks)
的大小,默認值是 0,無限制。
log_checkpoint_timeout:
兩 個 檢 查 點 之 間 的 時 間 長 度(秒)默 認 值 1800s。
fast_start_io_target:
決定了用於恢復時需要處理的塊的多少,默認值是 0,無限制。
fast_start_mttr_target:
直接決定了用於恢復的時間的長短,默認值是 0,無限制(SMON 進程執行的前滾
和回滾與用戶的回滾是不同的,SMON 是根據重做日誌文件進行前滾或回滾,而用戶的回滾一定是根據回滾段
的內容進行回滾的。
在這里要說一下回滾段存儲的數據,假如是 delete 操作,則回滾段將會記錄整個行的數據,假如是 update,
則回滾段只記錄被修改了的欄位的變化前的數據(前映像),也就是沒有被修改的欄位是不會被記錄的,假如是
insert,則回滾段只記錄插入記錄的 rowid。 這樣假如事務提交,那回滾段中簡單標記該事務已經提交;假如是
回退,則如果操作是 delete,回退的時候把回滾段中數據重新寫回數據塊,操作如果是 update,則把變化前數據
修改回去,操作如果是 insert,則根據記錄的 rowid 把該記錄刪除。
2.如果用戶 rollback。
則伺服器進程會根據數據文件塊和 DB BUFFER 中塊的頭部的事務列表和 SCN 以及回滾段地址找到
回滾段中相應的修改前的副本,並且用這些原值來還原當前數據文件中已修改但未提交的改變。如果有多個
「前映像」,伺服器進程會在一個「前映像」的頭部找到「前前映像」的回滾段地址,一直找到同一事務下的最早的
一個「前映像」為止。一旦發出了 COMMIT,用戶就不能rollback,這使得 COMMIT 後 DBWR 進程還沒有
全部完成的後續動作得到了保障。到現在為例一個事務已經結束了。
說明:
TM 鎖:
符合 lock 機制的,用於保護對象的定義不被修改。 TX 鎖:
這個鎖代表一個事務,是行
級鎖,用數據塊頭、數據記錄頭的一些欄位表示,也是符合 lock 機制,有 resource structure、lock
structure、enqueue 演算法。

⑶ sql存儲過程是什麼

所有設計優良的 Microsoft® SQL Server™ 2000 應用程序都應當使用存儲過程。不論是否將應用程序的業務邏輯寫入存儲過程都應如此。甚至連沒有業務邏輯組件的標准 Transact-SQL 語句,在用參數打包成存儲過程後也能獲得性能收益。編譯進存儲過程的 Transact-SQL 語句在執行時可省去大量的處理。
存儲過程的另一個優點是客戶端執行請求使用網路的效率比將等效的 Transact-SQL 語句發送到伺服器高。例如,假設應用程序需要將一個大的二進制值插入 image 數據列。為使用 INSERT 語句發送數據,該應用程序必須將該二進制值轉換為字元串(其大小翻倍),然後發送到伺服器。伺服器再將該值轉換回二進制格式以存儲在 image 列中。
相反,應用程序可以創建下列格式的存儲過程:
CREATE PROCEDURE P(@p1 image) AS INSERT T VALUES (@p1)
當客戶端應用程序請求執行過程 P 時,image 參數值將一直以二進制格式發送到伺服器,從而節省處理時間並減少網路流量。
如果 SQL Server 存儲過程中包含業務服務邏輯,因為業務服務邏輯將處理移動到數據,而不是將數據移動到處理,因而存儲過程能提供更大的性能收益。
存儲過程的優點
(1)存儲過程的能力大大增強了SQL語言的功能和靈活性。存儲過程可以用流控制語句編寫,有很強的靈活性,可以完成復雜的判斷和較復雜的 運算。
(2) 可保證數據的安全性和完整性。
● 通過存儲過程可以使沒有許可權的用戶在控制之下間接地存取資料庫,從而保證數據的安全。
● 通過存儲過程可以使相關的動作在一起發生,從而可以維護資料庫的完整性。
(3) 再運行存儲過程前,資料庫已對其進行了語法和句法分析,並給出了優化執行方案。這種已經編譯好的過程可極大地改善SQL語句的性能。 由於執行SQL語句的大部分工作已經完成,所以存儲過程能以極快的速度執行。
(4)可以降低網路的通信量。
(5) 使體現企業規則的運算程序放入資料庫伺服器中,以便:
● 集中控制。
● 當企業規則發生變化時在伺服器中改變存儲過程即可,無須修改任何應用程序。企業規則的特點是要經常變化,如果把體現企業規則的運算程序放入應用程序中,則當企業規則發生變化時,就需要修改應用程序工作量非常之大(修改、發行和安裝應用程序)。如果把體現企業規則的 運算放入存儲過程中,則當企業規則發生變化時,只要修改存儲過程就可以了,應用程序無須任何變化。

1.使用企業管理器創建用戶存儲過程
操作步驟如下:
(1)啟動SQL Server企業管理器。
(2)在「控制台根目錄」窗口,展開「SQL Server組」,首先,選擇「資料庫」,然後,選擇「存儲過程」,單擊滑鼠右鍵,打開快捷菜單。
(3)在打開快捷菜單中,選擇「新建存儲過程」菜單命令,進入「存儲過程屬性」窗口。
(4)在「存儲過程屬性」窗口,在文本框中輸入存儲過程代碼,單擊「確定」,結束存儲過程的創建。
2.使用T-SQL語句創建用戶存儲過程
SQL命令格式:
CREATE PROC [ EDURE ] <Procere_name> [ ; Number ]
[ { @parameter Data_type }
[ VARYING ] [ = Default ] [ OUTPUT ]] [ ,...n ]
[ WITH{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION }]
[ FOR REPLICATION ]
AS sql_statements
功能:創建一個用戶存儲過程,並保存在資料庫中。

⑷ 什麼是SQL的存儲過程

sql存儲過程說簡單點就是一個在t-sql下用戶可以自行定義的函數,
但是與一般的函數也有不同的地方,比如它的返回值只能return(int類型),如果你要輸出什麼信息的話只能用output.這也是存儲過程的一個特色吧,設定的參數可以有輸出。講起來有點抽象,給你個例子看看吧!
首先創建一個存儲過程
create
procere
cunchuguocheng
@a
int,
@b
int,
@c
int
output
as
begin
select
@c
=
@a+@b
return(0)
end
然後調用這個存儲過程
declare
@value
int,
--返回值
@c
int
--結果值
exec
@value
=
cunchuguocheng
2,2,@c
output
select
@value
as
返回值
select
@c
as
結果值
程序寫的很簡單,你運行一下我想你就會對存儲過程有所了解了。

⑸ 一條sql語句的執行過程

需要建立一張表來記錄
explain plan SET statement_id='name' FOR (這里是你要調試的語句 )
SELECT
A.OPERATION,
OPTIONS,
OBJECT_NAME,
OBJECT_TYPE,
ID,
PARENT_ID
FROM
PLAN_TABLE A
WHERE
STATEMENT_ID='name'
ORDER BY
Id;
ID 'name'是一個標識,你可以自己取,欄位有很多個,以下是各個欄位的解釋(可能格式不對,你可以復制後看):
欄位名 欄位類型 含義
STATEMENT_ID VARCHAR2(30) explain PLAN 語句中所指定的最優STATEMENT_ID 參數值, 如果在EXPLAN PLAN語句中沒有使用SET STATEMENT_ID,那麼此值會被設為NULL。
REMARKS VARCHAR2(80) 與被解釋規劃的各步驟相關聯的注釋最長可達80 位元組
OPERATION VARCHAR2(30) 各步驟所執行內部操作的名稱在某條語句所產生的第一行中該列的可能取值如下DELETE STATEMENT INSERT STATEMENT SELECT STATEMENT UPDATE STATEMENT
OPTIONS VARCHAR2(30) 對OPERATION 列中所描述操作的變種
OBJECT_NODE VARCHAR2(128) 用於訪問對象的資料庫鏈接database link 的名稱對於使用並行執行的本地查詢該列能夠描述操作中輸出的次序
OBJECT_OWNER VARCHAR2(30) 對於包含有表或索引的架構schema 給出其所有者的名稱
OBJECT_NAME VARCHAR2(30) 表或索引的名稱
OBJECT_INSTANCE INTEGER 根據對象出現在原始original 語句中的次序所給出的相應次序編號就原始的語句文本而論其處理順序為自左至右自外向內景象擴張view
OBJECT_TYPE VARCHAR2(30) 用於提供對象描述性信息的修飾符例如索引的NON-UNIQUE
OPTIMIZER VARCHAR2(255) 當前優化程序的模式
ID INTEGER 分配給執行規劃各步驟的編號
PARENT_ID INTEGER 對ID 步驟的輸出進行操作的下一個執行步驟的ID
POSITION INTEGER 對於具有相同PARENT_ID 的步驟其相應的處理次序
COST INTEGER 根據優化程序的基於開銷的方法所估計出的操作開銷值對於使用基於規則方法的語句該列為空該列值沒有特定的測量單位它只是一個用於比較執行規劃開銷大小的權重值
CARDINALITY INTEGER 根據基於開銷的方法對操作所訪問行數的估計值
BYTES INTEGER 根據基於開銷的方法對操作所訪問位元組的估計
=============================================
你按照我說的做,後面用
SELECT
*
FROM
PLAN_TABLE A
WHERE
STATEMENT_ID='name'
結果已經很清楚了,全部滿足你的要求。
各列的具體含義上面已經給出。

⑹ 一條sql的整個過程是怎樣的

SQL語句執行過程詳解


一、SQL語句執行原理:


第一步:客戶端把語句發給伺服器端執行
當我們在客戶端執行 select 語句時,客戶端會把這條 SQL 語句發送給伺服器端,讓伺服器端的
進程來處理這語句。也就是說,Oracle 客戶端是不會做任何的操作,他的主要任務就是把客戶端產生
的一些 SQL 語句發送給伺服器端。雖然在客戶端也有一個資料庫進程,但是,這個進程的作用跟伺服器
上的進程作用事不相同的。伺服器上的資料庫進程才會對SQL 語句進行相關的處理。不過,有個問題需
要說明,就是客戶端的進程跟伺服器的進程是一一對應的。也就是說,在客戶端連接上伺服器後,在客戶
端與伺服器端都會形成一個進程,客戶端上的我們叫做客戶端進程;而伺服器上的我們叫做伺服器進程。


第二步:語句解析


當客戶端把 SQL 語句傳送到伺服器後,伺服器進程會對該語句進行解析。同理,這個解析的工作,
也是在伺服器端所進行的。雖然這只是一個解析的動作,但是,其會做很多「小動作」。
1. 查詢高速緩存(library cache)。伺服器進程在接到客戶端傳送過來的 SQL 語句時,不
會直接去資料庫查詢。而是會先在資料庫的高速緩存中去查找,是否存在相同語句的執行計劃。如果在
數據高速緩存中,則伺服器進程就會直接執行這個 SQL 語句,省去後續的工作。所以,採用高速數據緩
存的話,可以提高 SQL 語句的查詢效率。一方面是從內存中讀取數據要比從硬碟中的數據文件中讀取
數據效率要高,另一方面,也是因為這個語句解析的原因。
不過這里要注意一點,這個數據緩存跟有些客戶端軟體的數據緩存是兩碼事。有些客戶端軟體為了
提高查詢效率,會在應用軟體的客戶端設置數據緩存。由於這些數據緩存的存在,可以提高客戶端應用軟
件的查詢效率。但是,若其他人在伺服器進行了相關的修改,由於應用軟體數據緩存的存在,導致修改的
數據不能及時反映到客戶端上。從這也可以看出,應用軟體的數據緩存跟資料庫伺服器的高速數據緩存
不是一碼事。
2. 語句合法性檢查(data dict cache)。當在高速緩存中找不到對應的 SQL 語句時,則服
務器進程就會開始檢查這條語句的合法性。這里主要是對 SQL 語句的語法進行檢查,看看其是否合乎
語法規則。如果伺服器進程認為這條 SQL 語句不符合語法規則的時候,就會把這個錯誤信息,反饋給客
戶端。在這個語法檢查的過程中,不會對 SQL 語句中所包含的表名、列名等等進行 SQL 他只是語法
上的檢查。
3. 語言含義檢查(data dict cache)。若 SQL 語句符合語法上的定義的話,則伺服器進程
接下去會對語句中的欄位、表等內容進行檢查。看看這些欄位、表是否在資料庫中。如果表名與列名不
准確的話,則資料庫會就會反饋錯誤信息給客戶端。所以,有時候我們寫 select 語句的時候,若語法
與表名或者列名同時寫錯的話,則系統是先提示說語法錯誤,等到語法完全正確後,再提示說列名或表名
錯誤。
4. 獲得對象解析鎖(control structer)。當語法、語義都正確後,系統就會對我們需要查詢
的對象加鎖。這主要是為了保障數據的一致性,防止我們在查詢的過程中,其他用戶對這個對象的結構發
生改變。
5. 數據訪問許可權的核對(data dict cache)。當語法、語義通過檢查之後,客戶端還不一定
能夠取得數據。伺服器進程還會檢查,你所連接的用戶是否有這個數據訪問的許可權。若你連接上伺服器
的用戶不具有數據訪問許可權的話,則客戶端就不能夠取得這些數據。有時候我們查詢數據的時候,辛辛苦
苦地把 SQL 語句寫好、編譯通過,但是,最後系統返回個 「沒有許可權訪問數據」的錯誤信息,讓我們氣
半死。這在前端應用軟體開發調試的過程中,可能會碰到。所以,要注意這個問題,資料庫伺服器進程先
檢查語法與語義,然後才會檢查訪問許可權。
6. 確定最佳執行計劃 。當語句與語法都沒有問題,許可權也匹配的話,伺服器進程還是不會直接對
資料庫文件進行查詢。伺服器進程會根據一定的規則,對這條語句進行優化。不過要注意,這個優化是有
限的。一般在應用軟體開發的過程中,需要對資料庫的 sql 語言進行優化,這個優化的作用要大大地大
於伺服器進程的自我優化。所以,一般在應用軟體開發的時候,資料庫的優化是少不了的。當伺服器進程
的優化器確定這條查詢語句的最佳執行計劃後,就會將這條 SQL 語句與執行計劃保存到數據高速緩存
(library cache)。如此的話,等以後還有這個查詢時,就會省略以上的語法、語義與許可權檢查的步驟,
而直接執行 SQL 語句,提高 SQL 語句處理效率。


第三步:語句執行


語句解析只是對 SQL 語句的語法進行解析,以確保伺服器能夠知道這條語句到底表達的是什麼意
思。等到語句解析完成之後,資料庫伺服器進程才會真正的執行這條 SQL 語句。這個語句執行也分兩
種情況。
一是若被選擇行所在的數據塊已經被讀取到數據緩沖區的話,則伺服器進程會直接把這個數據傳遞
給客戶端,而不是從資料庫文件中去查詢數據。
若數據不在緩沖區中,則伺服器進程將從資料庫文件中查詢相關數據,並把這些數據放入到數據緩沖
區中(buffer cache)。


第四步:提取數據


當語句執行完成之後,查詢到的數據還是在伺服器進程中,還沒有被傳送到客戶端的用戶進程。所以,
在伺服器端的進程中,有一個專門負責數據提取的一段代碼。他的作用就是把查詢到的數據結果返回給
用戶端進程,從而完成整個查詢動作。從這整個查詢處理過程中,我們在資料庫開發或者應用軟體開發過
程中,需要注意以下幾點:
一是要了解資料庫緩存跟應用軟體緩存是兩碼事情。資料庫緩存只有在資料庫伺服器端才存在,在
客戶端是不存在的。只有如此,才能夠保證資料庫緩存中的內容跟資料庫文件的內容一致。才能夠根據
相關的規則,防止數據臟讀、錯讀的發生。而應用軟體所涉及的數據緩存,由於跟資料庫緩存不是一碼事
情,所以,應用軟體的數據緩存雖然可以提高數據的查詢效率,但是,卻打破了數據一致性的要求,有時候
會發生臟讀、錯讀等情況的發生。所以,有時候,在應用軟體上有專門一個功能,用來在必要的時候清除
數據緩存。不過,這個數據緩存的清除,也只是清除本機上的數據緩存,或者說,只是清除這個應用程序
的數據緩存,而不會清除資料庫的數據緩存。
二是絕大部分 SQL 語句都是按照這個處理過程處理的。我們 DBA 或者基於 Oracle 資料庫的
開發人員了解這些語句的處理過程,對於我們進行涉及到 SQL 語句的開發與調試,是非常有幫助的。有
時候,掌握這些處理原則,可以減少我們排錯的時間。特別要注意,資料庫是把數據查詢許可權的審查放在
語法語義的後面進行檢查的。所以,有時會若光用資料庫的許可權控制原則,可能還不能滿足應用軟體許可權
控制的需要。此時,就需要應用軟體的前台設置,實現許可權管理的要求。而且,有時應用資料庫的許可權管
理,也有點顯得繁瑣,會增加伺服器處理的工作量。因此,對於記錄、欄位等的查詢許可權控制,大部分程
序涉及人員喜歡在應用程序中實現,而不是在資料庫上實現。
DBCC DROPCLEANBUFFERS
從緩沖池中刪除所有清除緩沖區。
DBCC FREEPROCCACHE
從過程緩存中刪除所有元素。
DBCC FREESYSTEMCACHE
從所有緩存中釋放所有未使用的緩存條目
SQL語句中的函數、關鍵字、排序等執行順序:
1. FROM 子句返回初始結果集。
2. WHERE 子句排除不滿足搜索條件的行。
3. GROUP BY 子句將選定的行收集到 GROUP BY 子句中各個唯一值的組中。
4. 選擇列表中指定的聚合函數可以計算各組的匯總值。
5. 此外,HAVING 子句排除不滿足搜索條件的行。
6. 計算所有的表達式;
7. 使用 order by 對結果集進行排序。
8. 查找你要搜索的欄位。

⑺ 描述資料庫創建到SQL Server中的過程

從物理結構上講,每個資料庫都包含有數據文件和日誌文件。開始使用資料庫前,必須先創建資料庫,以便生成這些文件。在SQL Server 2005中創建資料庫的方法很多,其中最主要的方法是:

l 直觀地利用SQL Server Management Studio創建資料庫。

l 通過Transact-SQL代碼創建資料庫。

注意

新建的資料庫實際上是根據Model資料庫中保存的資料庫模板創建的,也就是說它是Model資料庫的一個副本。

下面將分別介紹這兩種創建資料庫的方法。

6.3.1 利用SQL Server Management Studio創建資料庫
在SQL Server Management Studio中,用戶可以非常方便地利用圖形化的方法創建資料庫。接下來,我們將利用這種方法創建一個示例資料庫——Customers資料庫。

(1) 選擇【開始】|【程序】| Microsoft SQL Server 2005 | SQL Server Management Studio命令,打開SQL Server Management Studio。

(2) 使用【Windows身份驗證】連接到SQL Server 2005資料庫實例。

(3) 展開SQL Server實例,右擊【資料庫】,然後從彈出的快捷菜單中選擇【新建資料庫】命令,打開【新建資料庫】對話框,如圖6.2所示。

(4) 在【新建資料庫】對話框中,輸入資料庫名稱Customers。

圖6.2 新建資料庫

提示

資料庫的名稱必須遵循SQL Server 2005命名規則。名字的長度在1~128個字元之間;名稱的第一個字元必須是字母或者「_」、「@」和「#」中的任意字元;名稱中不能包含空格和SQL Server 2005的保留字(如master)。

(5) 如果接受所有默認值,可以單擊【確定】按鈕結束創建工作;由於本示例中的Customers資料庫沒有用默認值,因此還需要繼續下面的可選步驟。

(6) 在【所有者】下拉列表框中可以選擇資料庫的所有者。資料庫的所有者是對資料庫有完全操作許可權的用戶。默認值表示當前登錄Windows系統的是管理員賬戶。Customers資料庫需要更改所有者名稱,因此單擊「...」按鈕,打開【選擇資料庫所有者】對話框,如圖6.3所示。在這個對話框中單擊【瀏覽】按鈕,打開【查找對象】對話框,如圖6.4所示,在對話框中選擇登錄對象sa作為資料庫的所 有者。

圖6.3 選擇資料庫所有者

圖6.4 選擇對象

(7) 選中【使用全文索引】復選框,啟用資料庫的全文搜索。這樣資料庫中的變長復雜數據類型列也可以建立索引。

(8) 在Customer上添加新文件組。選中【文件組】頁,單擊【添加】按鈕,接著輸入文件組的名稱「DefaultGroup」,並選中這個文件組的【默認值】選項,如圖6.5所示。

圖6.5 添加文件組

(9) 如果要更改主數據文件和事務日誌文件的默認值,可以在【資料庫文件】列表框中單擊相應的單元並輸入新值。對於Customers資料庫,需要在主數據文件的【初始大小】欄中輸入新的初始大小值10MB;接著單擊【自動增長】欄中的「...」按鈕,打開更改自動增長設置對話框(如圖6.6所示),選中【按MB】單選按鈕,將值更改為2MB,並選中【不限制文件增長】單選按鈕;最後在日誌文件的【路徑】欄中輸入新的日誌文件路徑「D:\DataBaseLog」。

圖6.6 更改主數據文件的自動增長設置

(10) 在Customers資料庫中添加新的數據文件Customers_1:在【常規】頁中單擊【添加】按鈕,在【資料庫文件】列表框中會添加一個新行,在【邏輯名稱】欄中輸入文件的名稱「Customers1」,在【文件類型】欄中選擇【數據】類型。在【文件組】中選擇DefaultGroup文件組,其他接受默認值,如圖6.7所示。

圖6.7 添加數據文件和日誌文件

(11) 在Customers資料庫中添加新的日誌文件Customers_Log1。在【常規】頁中單擊【添加】按鈕,在【資料庫文件】列表框中會添加一個新行,在【邏輯名稱】欄中輸入文件的名稱「Customers_log1」,在【文件類型】欄中選擇【日誌】類型,在【路徑】欄中輸入新的路徑「D:\DataBaseLog」,其他接受默認值。

(12) 如果要更改資料庫的排序規則,可以選擇【選項】頁(如圖6.8所示),然後在【排序規則】下拉列表框中選擇一個排序規則。Customers資料庫使用默認的排序規則。

圖6.8 選擇資料庫的排序規則

提示

排序規則指定了SQL字元存儲和比較所使用的規則,以及字元保存的結構。詳細的排序規則定義可以參考SQL Server 2005的聯機文檔。

(13) 如果要更改恢復模式,可以在【選項】頁的【恢復模式】下拉列表框中選擇一個恢復模式,如圖6.9所示。Customers資料庫使用【完整】模式。

圖6.9 選擇恢復模式

提示

恢復模式的具體定義,可以參考後面章節的相關內容。

(14) 如果要更改資料庫選項,可以選擇【選項】頁,然後修改資料庫的選項。Customers資料庫不需要更改這些選項。

(15) 單擊【確定】按鈕完成資料庫的創建。

(16) 在執行完以上步驟後,SQL Server資料庫引擎就會在資料庫實例中創建一個新的資料庫Customers,如圖6.10所示。

圖6.10 創建了一個新的資料庫Customers

6.3.2 通過Transact-SQL代碼創建資料庫
除了可以通過SQL Server Management Studio的圖形化界面創建資料庫外,還可以使用Transact-SQL語言提供的CREATE DATABASE語句來創建資料庫。對於具有豐富的編程經驗的用戶,後一種方法更加簡單有效。下面首先介紹CREATE DATABASE語句的語法,接著描述了使用CREATE DATABASE語句創建上一節中的Customers示例資料庫的方法。

1. CREATE DATABASE語句的語法和參數
CREATE DATABASE語句的語法約定如下所示。

CREATE DATABASE database_name

[ ON

[ PRIMARY ] [ <filespec> [ ,...n ]

[ , <filegroup> [ ,...n ] ]

]

[

[ LOG ON { <filespec> [ ,...n ] } ] ]

[ COLLATE collation_name ]

[ FOR { ATTACH [ WITH <service_broker_option> ]

| ATTACH_REBUILD_LOG }]

[ WITH <external_access_option> ]

]

[;]

<filespec> ::=

{

( NAME = logical_file_name ,

FILENAME = 'os_file_name'

[ , SIZE = size [ KB | MB | GB | TB ] ]

[ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ]

[ , FILEGROWTH = growth_increment [ KB | MB | GB | TB | % ] ]

) [ ,...n ]

}

<filegroup> ::=

{ FILEGROUP filegroup_name [ DEFAULT ]

<filespec> [ ,...n ] }

<external_access_option> ::=

{ DB_CHAINING { ON | OFF }

| TRUSTWORTHY { ON | OFF }

}

<service_broker_option> ::=

{ ENABLE_BROKER

| NEW_BROKER

| ERROR_BROKER_CONVERSATIONS

}

CREATE DATABASE語句中的參數說明如下。

l database_name:新資料庫的名稱。資料庫名稱在 SQL Server 的實例中必須唯一,並且必須符合標識符規則。如果未指定數據文件的名稱,則 SQL Server 使用database_name作為logical_file_name和os_file_name。

l ON:指定顯式定義用來存儲資料庫數據部分的磁碟文件(數據文件)。當後面是以逗號分隔的、用以定義主文件組的數據文件的<filespec>項列表時,需要使用ON。主文件組的文件列表可後跟以逗號分隔的、用以定義用戶文件組及其文件的<filegroup>項列表(可選)。

l PRIMARY:指定關聯的<filespec>列表定義主文件。在主文件組的<filespec>項中指定的第一個文件將成為主文件。一個資料庫只能有一個主文件。如果沒有指定 PRIMARY,那麼 CREATE DATABASE 語句中列出的第一個文件將成為主文件。

l LOG ON:指定顯式定義用來存儲資料庫日誌的磁碟文件(日誌文件)。LOG ON後跟以逗號分隔的用以定義日誌文件的<filespec> 項列表。如果沒有指定 LOG ON,將自動創建一個日誌文件,其大小為該資料庫的所有數據文件大小總和的 25%,取兩者之中的較大者。

l COLLATE collation_name:指定資料庫的默認排序規則。排序規則名稱既可以是 Windows 排序規則名稱,也可以是 SQL 排序規則名稱。如果沒有指定排序規則,則將 SQL Server 實例的默認排序規則分配為資料庫的排序規則。不能使用 FOR ATTACH 或 FOR ATTACH_REBUILD_LOG 子句指定排序規則名稱。

l FOR ATTACH:指定通過附加一組現有的操作系統文件來創建資料庫。必須有一個指定主文件的 <filespec> 項。至於其他 <filespec> 項,只需要指定與第一次創建資料庫或上一次附加資料庫時路徑不同的文件的那些項即可。必須有一個<filespec>項指定這些文件。FOR ATTACH 具有以下要求:所有數據文件(MDF 和 NDF)都必須可用;如果存在多個日誌文件,這些文件都必須可用;如果一個可讀/寫資料庫具有一個當前不可用的日誌文件,並且進行附加操作前在沒有被使用或打開情況下關閉了該資料庫,那麼FOR ATTACH會自動重新生成日誌文件並更新主文件。相比之下,對於只讀資料庫,由於主文件不能更新,將不能重新生成日誌。因此,如果附加一個日誌不可用的只讀資料庫,必須在 FOR ATTACH 子句中提供日誌文件或文件。

l FOR ATTACH_REBUILD_LOG:指定通過附加一組現有的操作系統文件來創建資料庫。該選項只限於讀/寫資料庫。如果缺少一個或多個事務日誌文件,將重新生成日誌文件。必須有一個指定主文件的 <filespec> 項。 使用FOR ATTACH_REBUILD_LOG參數必須確保完全關閉資料庫並且所有數據文件都 可用。

l <filespec>:控制文件屬性。

l NAME logical_file_name:指定文件的邏輯名稱。在Creat Name中命名用了下面介紹指定FILENAME參數時,就需要設置NAME參數,除非指定FOR ATTACH子句之一。

l logical_file_name:引用文件時,SQL Server 中使用的邏輯名稱。logical_file_name 必須在資料庫中唯一,必須符合標識符規則。名稱可以是字元或 Unicode 常量,也可以是常規標識符或分隔標識符。

l FILENAME ' os_file_name ':指定操作系統(物理)文件名稱。os_file_name是創建文件時由操作系統使用的路徑和文件名。文件必須駐留在下列設備中:安裝 SQL Server 的本地伺服器、存儲區域網絡(Storage Area Network,簡稱SAN)或基於 iSCSI 的網路。執行 CREATE DATABASE 語句前,指定路徑必須存在。日誌文件一定不要放在壓縮文件系統中。

l SIZE size:指定文件的大小。size是文件的初始大小。如果沒有為主文件提供初始大小,則資料庫引擎將使用model資料庫中的主文件的大小。如果指定了輔助數據文件或日誌文件,但未指定該文件的初始大小,則資料庫引擎將以 1 MB 作為該文件的大小。此外,為資料庫主文件指定的大小至少應與model資料庫的主文件大小相同。可以使用千位元組(KB)、兆位元組(MB)、千兆位元組(GB)或兆兆位元組(TB)單位,默認值為 MB。這個值必須為整數,對於大於 2 147 483 647 的值,使用更大的單位。

l MAXSIZE max_size:指定文件可增大到的最大大小。max_size 表示最大的文件大小。可以使用KB、MB、GB和TB單位,默認值為MB。如果不指定文件的最大尺寸,則文件將增長到磁碟被充滿為止。這個值必須為整數,對於大於 2 147 483 647 的值,使用更大的單位。

l UNLIMITED:指定文件將增長到整個磁碟。在 SQL Server 2005 中,規定日誌文件可增長的最大大小為 2TB,而數據文件的最大大小為 16TB。

l FILEGROWTH growth_increment:指定文件的自動增量。文件的 FILEGROWTH 設置不能超過 MAXSIZE 設置。growth_increment表示每次需要新空間時為文件添加的空間量。值為 0 時表明自動增長被設置為關閉,不允許增加空間。如果未指定 FILEGROWTH,則數據文件的默認值為1MB,日誌文件的默認增長比例為10%,並且最小值為64KB。

l <filegroup>:控制文件組屬性。

l FILEGROUP filegroup_name:文件組的邏輯名稱。filegroup_name必須在資料庫中唯一,不能是系統提供的名稱 PRIMARY 和 PRIMARY_LOG。名稱可以是字元或Unicode常量,也可以是常規標識符或分隔標識符。名稱必須符合標識符規則。

l DEFAULT:指定命名文件組為資料庫中的默認文件組。

l <external_access_option>:控制外部與資料庫之間的雙向訪問。

l DB_CHAINING { ON | OFF }:當指定為 ON 時,可以連接跨資料庫伺服器的鏈接源或目標。當為 OFF 時,資料庫不能參與跨資料庫所有權的鏈接。默認值 為OFF。

l TRUSTWORTHY { ON | OFF }:當指定為ON時,使用模擬上下文的資料庫模塊(例如,視圖、用戶定義函數或存儲過程)可以訪問資料庫以外的資源。當為OFF時,模擬上下文中的資料庫模塊不能訪問資料庫以外的資源。默認值為OFF。

l <service_broker_option>:控制資料庫上的Service Broker選項。

l ENABLE_BROKER:對指定的資料庫啟用 Service Broker服務。

l NEW_BROKER:在sys.databases 和還原資料庫中創建一個新的 service_ broker_guid 值。

l ERROR_BROKER_CONVERSATIONS:結束所有會話,並產生一個錯誤信息指出資料庫已附加或還原。

2. 使用CREATE DATABASE語句創建Customers資料庫
使用一條 CREATE DATABASE 語句就可以創建資料庫以及存儲該資料庫的文件。SQL Server通過使用以下步驟實現CREATE DATABASE語句: 首先,SQL Server 2005 資料庫引擎使用model資料庫的副本初始化該資料庫及其元數據;接著,為資料庫分配 Service Broker GUID;最後,使用空頁填充資料庫的剩餘部分(包含記錄資料庫中空間使用情況的內部數據頁除外)。在一個 SQL Server 的實例中最多可以指定32 767個資料庫。

下面使用CREATE DATABASE語句重新創建上一節中創建的Customers示例資料庫。具體步驟如下。

(1) 打開SQL Server Management Studio,並用【Windows身份驗證】登錄。

(2) 選中資料庫實例,右擊,從彈出的快捷菜單中選擇【新建查詢選項】命令,打開查詢編輯窗口。

(3) 在查詢編輯窗口中輸入如下的Transact-SQL語句:

CREATE DATABASE Customers

ON PRIMARY

(

NAME = Customers,

FILENAME = 'C:\Program Files\Microsoft SQL Server\ MSSQL.1\MSSQL\DATA\ Customers.mdf',

SIZE = 10,

MAXSIZE = UNLIMITED,

FILEGROWTH = 2

),

FILEGROUP DefaultGroup

(

NAME = Customers_1,

FILENAME = 'C:\Program Files\Microsoft SQL Server\ MSSQL.1\ MSSQL\DATA\ Customers_1.ndf',

SIZE = 3MB,

MAXSIZE = UNLIMITED,

FILEGROWTH = 1MB

)

LOG ON

(

NAME = Customers_log,

FILENAME = 'D:\DataBaseLog \Customers_log.ldf',

SIZE = 1MB,

MAXSIZE = UNLIMITED,

FILEGROWTH = 10%

),

(

NAME = Customers_log1,

FILENAME = 'D:\DataBaseLog\Customers_log1.ldf',

SIZE =3MB,

MAXSIZE = UNLIMITED,

FILEGROWTH = 10%

)

(4) 單擊工具欄上的【執行】按鈕執行上面輸入的SQL語句。

(5) 在查詢執行後,查詢結果窗口中會返回查詢執行的結果。如果查詢執行沒有錯誤,在對象資源管理窗口中展開資料庫實例下的【資料庫】項,可以看到新建的Customers資料庫,如圖6.11所示。

注意

在重新創建Customers資料庫前,必須首先刪除上一節中建立的Customers資料庫。

提示

在創建資料庫時,請根據資料庫中預期的最大數據量,創建盡可能大的數據文件。另外,創建、修改或刪除用戶資料庫後,應備份 master 資料庫。

圖6.11 使用CREATE DATABASE語句創建Customers資料庫

要縮小某個分區的容量大小,該分區內必須存在未被使用的磁碟空間;要增大某個分區的容量大小,必須存在緊鄰該分區的自由空間。

⑻ 請幫忙詳細解釋一下SQL的存儲過程:(請逐行解釋,謝謝)

有重復的,只介紹部分有用並且關鍵的。由於你的代碼是部分的,所以只能大概的給你解釋,讓你知道每一步基本上的作用,不能詳細的解釋哪個變數是干什麼的,那需要看到整個程序後才可以的。希望你能理解。有問題可以再直接向我提問。祝你好運、。
USE [XYS]---確定資料庫名
GO
/****** Object: StoredProcere [dbo].[usp_kpi_rfid_report2] Script Date: 03/22/2011 14:11:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_kpi_rfid_report2] --存儲結構作用的表名
@factory varchar(10),----定義變數
@ship_date_from varchar(10),
@ship_date_to varchar(10),
@work_date varchar(10),
@fz_major varchar(3),
@zj_major varchar(3),
@component varchar(3),
@component2 varchar(3),
@WC varchar(1),
@PX varchar(1),
@PO varchar(20)

AS

/*

exec usp_kpi_rfid_report2 ---將讀取到的數據重新命名
@factory='', --工廠
@ship_date_from = '', --船期開始
@ship_date_to = '', --船期結束
@work_date= '22-03-2011', --生產日期
@fz_major = '001', --發毛工序
@zj_major = '003', --配扎工序
@component = '001', --全件部件
@component2 = '996', --後整部件
@WC = '1', --查詢未完成,=1可以查詢已完成
@PX = '0', --=0按PO排序,=1按交貨期排序
@po='hb0084'

*/

declare @work_date_from datetime, --創建觸發器
@work_date_to datetime,定義變數
@date datetime,
@px_txt varchar(20),
@px_sql varchar(1000)
---查詢數據,按照上面的變數查詢
使用觸發器判斷數據是否改變如果改變就進行相用的處理。
if len(@ship_date_from) = 0 or @ship_date_from = '-1' or @ship_date_from is null
select @ship_date_from = '', @work_date_from = nullelse
select @work_date_from = convert(datetime, @ship_date_from, 105)

if len(@ship_date_to) = 0 or @ship_date_to = '-1' or @ship_date_to is null
select @ship_date_to = '', @work_date_to = null
else
select @work_date_to = convert(datetime, @ship_date_to, 105)

if len(@work_date) = 0 or @work_date = '-1' or @work_date is null
select @work_date = '', @date = null
else
select @date = convert(datetime, @work_date, 105)

if @px='0'
select @px_txt='sp_ord_no'
else
select @px_txt='po_startdate'