⑴ 多選,急求答案
1.答案A,D,E DESC是降序,省略ASC和DESC,默認為升序。 2.答案A,C,D,E 創建視圖時不允許在所用SELECT語句中使用ORDER BY、COMPUTE子句 3.C,D,E 執行存儲過程時可用WITH RECOMPLE選項進行重新編譯;只有當執行存儲過程的語句是批處理中的第一個語句,才可以直接通過名稱來調用存儲過程 4.C,E 使用SQL Server Management Studio不能運行命令行實用程序sqlcmd 5.C,D,F 一個局部變數只能在一個語句批中使用,使用SET語句只能對一個局部變數賦值,剛定義的局部變數的初值為空值 6.B 用戶定義函數可以有輸入參數和返回值
⑵ 數據結構問題簡單描述存儲過程的使用步驟
Sql Server的存儲過程是一個被命名的存儲在伺服器上的Transacation-Sql語句集合,是封裝重復性工作的一種方法,它支持用戶聲明的變數、條件執行和其他強大的編程功能。
存儲過程相對於其他的資料庫訪問方法有以下的優點:
(1)重復使用。存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。
(2)提高性能。存儲過程在創建的時候就進行了編譯,將來使用的時候不用再重新編譯。一般的SQL語句每執行一次就需要編譯一次,所以使用存儲過程提高了效率。
(3)減少網路流量。存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。
(4)安全性。參數化的存儲過程可以防止SQL注入式的攻擊,而且可以將Grant、Deny以及Revoke許可權應用於存儲過程。
存儲過程一共分為了三類:用戶定義的存儲過程、擴展存儲過程以及系統存儲過程。
其中,用戶定義的存儲過程又分為Transaction-SQL和CLR兩種類型。
Transaction-SQL 存儲過程是指保存的Transaction-SQL語句集合,可以接受和返回用戶提供的參數。
CLR存儲過程是指對.Net Framework公共語言運行時(CLR)方法的引用,可以接受和返回用戶提供的參數。他們在.Net Framework程序集中是作為類的公共靜態方法實現的。(本文就不作介紹了)
創建存儲過程的語句如下:
CREATE { PROC | PROCEDURE } [schema_name.] procere_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ [ OUT [ PUT ]
] [ ,n ]
[ WITH <procere_option> [ ,n ]
[ FOR REPLICATION ]
AS { <sql_statement> [;][ n ] | <method_specifier> }
[;]
<procere_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE_AS_Clause ]
<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }
<method_specifier> ::=
EXTERNAL NAME assembly_name.class_name.method_name
[schema_name]: 代表的是存儲過程所屬的架構的名稱
例如:
Create Schema yangyang8848
Go
Create Proc yangyang8848.AllGoods
As Select * From Master_Goods
Go
執行:Exec AllGoods 發生錯誤。
執行:Exec yangyang8848.AllGoods 正確執行。
[;Number]: 用於對同名過程進行分組的可選整數。使用一個 DROP PROCEDURE 語句可將這些分組過程一起刪除。
例如:
Create Proc S1 ;1
AS
Select * From Master_Goods
Go
Create Proc S1 ;2
As
Select * From Master_Location
Go
創建完畢了兩個存儲過程。它們在同一個組S1里,如果執行Exec S1 則存儲過程默認執行 Exec S1 ;1 。如果我們想得到所有據點信息則需要執行Exec S1 ;2。當我們要刪除存儲過程的時候,只能執行Drop Exec S1 則該組內所有的存儲過程被刪除。
[@ parameter]: 存儲過程中的參數,除非將參數定義的時候有默認值或者將參數設置為等於另一個參數,否則用戶必須在調用存儲過程的時候為參數賦值。
存儲過程最多有2100個參數。
例如:
Create Proc yangyang8848.OneGoods
@GoodsCode varchar(10)
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Go
調用的代碼:
Declare @Code varchar(10)
Set @Code = '0004'
Exec yangyang8848.OneGoods @Code
在參數的後邊加入Output 表明該參數為輸出參數。
Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) output,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go
調用方法:
Declare @VV2 varchar(10)
Exec yangyang8848.OneGoods @Code out
注意:如果存儲過程的兩個參數一個有默認值一個沒有,那麼我們要把有默認值得放在後邊,不然會出問題哦~~
細心的朋友,可能看到上邊的語句有一些不同,比如,存儲過程用的是output,而調用語句用的是out。我要告訴您,兩者是一樣的。
[RECOMPILE]:指示資料庫引擎 不緩存該過程的計劃,該過程在運行時編譯。如果指定了 FOR REPLICATION,則不能使用此選項。對於 CLR 存儲過程,不能指定 RECOMPILE。
這個說一個非常好用的函數 OBJECT_ID :返回架構范圍內對象的資料庫對象標識號。
例如:我們創建存儲過程時,可以如下寫代碼
If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go
Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go
針對於上邊的這個存儲過程,我們調用以下SQL查詢
Select definition From sys.sql_moles
Where object_id = Object_ID('yangyang8848.OneGoods');
我們是可以查到結果的。
可是如果我們對該存儲過程加入[ ENCRYPTION ] 那麼你將無法看到任何結果 然後我們查詢 sys.sql_moles 目錄視圖,將返回給你Null。
If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go
Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'
With Encryption
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go
然後我們執行以下SQL: Exec sp_helptext 'yangyang8848.OneGoods'
你將得到以下結果:The text for object 'yangyang8848.OneGoods' is encrypted.
說到這里你應該明白了,參數[ ENCRYPTION ]:是一種加密的功能, 將 CREATE PROCEDURE 語句的原始文本轉換為模糊格式。模糊代碼的輸出在 SQL Server 2005 的任何目錄視圖中都不能直接顯示。對系統表或資料庫文件沒有訪問許可權的用戶不能檢索模糊文本。但是,可通過 DAC 埠訪問系統表的特權用戶或直接訪問資料庫文件的特權用戶可使用此文本。此外,能夠向伺服器進程附加調試器的用戶可在運行時從內存中檢索已解密的過程。
前兩天寫了一篇關於游標的介紹文章 ,下邊寫一個例子,將游標與存儲過程一起使用上:
If Object_ID('dbo.GetMasterGoods') Is Not Null
Drop Proc dbo.GetMasterGoods
Go
Create Proc GetMasterGoods
@MyCursor Cursor Varying Output
With Encryption
As
Set @MyCursor = Cursor
For
Select GoodsCode,GoodsName From Master_Goods
Open @MyCursor
Go
--下邊建立另外一個存儲過程,用於遍歷游標輸出結果
Create Proc GetAllGoodsIDAndName
As
Declare @GoodsCode varchar(18)
Declare @GoodsName nvarchar(20)
Declare @MasterGoodsCursor Cursor
Exec GetMasterGoods @MasterGoodsCursor out
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
While(@@Fetch_Status = 0)
Begin
Begin
Print @GoodsCode + ':' + @GoodsName
End
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
End
Close @MasterGoodsCursor
Deallocate @MasterGoodsCursor
Go
最後執行Exec GetAllGoodsIDAndName結果為以下內容
0003:品0003
0004:品0004
0005:123123
0006:品0006
0007:品0007
0008:品0008
0009:品0009
0010:品0010
0011:品0011
0012:品0012
0013:品0013
0014:品0014
⑶ SQL中存儲過程是干什麼用的
存儲過程是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,它存儲在資料庫中,一次編譯後永久有效,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是資料庫中的一個重要對象。
資料庫存儲過程的實質就是部署在資料庫端的一組定義代碼以及SQL。將常用的或很復雜的工作,預先用SQL語句寫好並用一個指定的名稱存儲起來,那麼以後要叫資料庫提供與已定義好的存儲過程的功能相同的服務時,只需調用execute,即可自動完成命令。
每個參數名前要有一個「@」符號,每一個存儲過程的參數僅為該程序內部使用,參數的類型除了IMAGE外,其他SQL Server所支持的數據類型都可使用。
(3)用於重新編譯存儲過程的語句是擴展閱讀:
SQL中存儲過程優點:
1、重復使用。存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。
2、減少網路流量。存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。
3、安全性。參數化的存儲過程可以防止SQL注入式攻擊,而且可以將Grant、Deny以及Revoke許可權應用於存儲過程。
4、存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。
⑷ 存儲過程疑問
看存儲過程定義,它本來就是帶參的,如果一個復雜的select語句但是沒有參數的話,那還不如建個視圖
以下信息來源網路
存儲過程(Stored Procere)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,經編譯後存儲在資料庫中,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。
1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。
2.當對資料庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。
3.存儲過程可以重復使用,可減少資料庫開發人員的工作量
4.安全性高,可設定只有某些用戶才具有對指定存儲過程的使用權
有一點需要注意的是,一些網上盛傳的所謂的存儲過程要比sql語句執行更快的說法,實際上是個誤解,並沒有根據,包括微軟內部的人也不認可這一點,所以不能作為正式的優點,希望大家能夠認識到這一點。
⑸ 用什麼命令可以重新編譯所有的存儲過程
這是我同事做的一個存儲過程,我們一般都用這個處理
CREATE OR REPLACE PROCEDURE OWN.P_HSJ_COMPRE
IS
CURSOR cur_invalid_obj IS
SELECT uo.object_name,uo.object_type
FROM user_objects uo,
USER_ORDER_OBJECT_BY_DEPEND uobd
WHERE uo.object_id = uobd.object_id(+) AND uo.status != 'VALID'
ORDER BY uobd.dlevel desc,uo.object_type,uo.object_name;
ls_objname VARCHAR2(100);
ls_objtype VARCHAR2(100);
ls_status VARCHAR2(20);
ls_text VARCHAR2(4000);
ls_sql varchar2(100);
BEGIN
OPEN cur_invalid_obj;
LOOP
FETCH cur_invalid_obj INTO ls_objname,ls_objtype;
EXIT WHEN cur_invalid_obj%NOTFOUND;
IF ls_objtype IN ('PACKAGE BODY', 'PACKAGE', 'FUNCTION', 'PROCEDURE','TRIGGER', 'VIEW') THEN
if ls_objtype ='VIEW' then
ls_sql :=' ALTER VIEW '||LS_OBJNAME ||' COMPILE';
execute immediate ls_sql;
else
DBMS_DDL.alter_compile(ls_objtype,NULL,ls_objname);
end if;
SELECT status INTO ls_status FROM user_objects
WHERE object_name = ls_objname AND object_type = ls_objtype;
/* IF ls_status != 'VALID' THEN
SELECT text INTO ls_text FROM user_errors
WHERE name = ls_objname AND type = ls_objtype;
END IF;
*/
END IF;
END LOOP;
CLOSE cur_invalid_obj;
EXCEPTION
WHEN OTHERS THEN
IF cur_invalid_obj%ISOPEN THEN
CLOSE cur_invalid_obj;
END IF;
END;
/
⑹ 如何重新編譯存儲過程用一條什麽命令
使用execute,例如:
execute obooke;
⑺ 在使用什麼命令可以將規則綁定到指定的表
VB實現SQL Server 2000存儲過程調用
存儲過程是存儲在伺服器上的一組預編譯的Transact-SQL語句,是一種封裝重復任務操作的方法,支持用戶提供的變數,具有強大的編程功能。它類似於DOS系統中的BAT文件。在BAT文件中,可以包含一組經常執行的命令,這組命令通過BAT文件的執行而被執行。同樣的道理,可以把要完成某項任務的許多Transact-SQL語句寫在一起,組織成存儲過程的形式,通過執行該存儲過程就可以完成這項任務。存儲過程與BAT文件又有差別,即存儲過程已經進行了預編譯。
1、創建存儲過程的方法 在Transact-SQL語言中,創建存儲過程可以使用CREATE PROCEDURE語句,其語法形式如下:
CREATE PROC[EDURE] procere_name[;number]
[{@parameter data_type}[VARYING][=default][OUTPUT]
]],…n]
[WITH{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
[FOR REPLICATION]
AS
sql_statement[…n] 在上面的CREATE PROCEDURE語句中,方括弧"[
]"中的內容是可選的,花括弧"{}"中的內容是必須出現的,不能省略,[,…n]表示前面的參數樣式,可以重復出現。豎線"|"表示兩邊的選項可以任選一個。
下面分析該語句中各種選項的含義。 CREATE PROCEDURE是關鍵字,也可以寫成CREATE PROC。
procere_name是該存儲過程的名稱,名稱可以是任何符合命名規則的標示符。名稱後的[;number]參數表示可以定義一系列的存儲過程名稱,這些存儲過程的數量由number指定。
參數名稱可以使用@parameter
data_type來指定。在Transact-SQL語言中,用戶定義的參數名稱前面加"@"符號,這些數據類型是Transact-SQL語言允許的各種數據類型,包括系統提供的數據類型和用戶定義的數據類型。
當參數類型為cursor時,必須使用關鍵字VARYING和OUTPUT。VARYING表示結果集可以是一個輸出參數,其內容是動態的。該關鍵字只能在使用游標作為數據類型時使用。關鍵字OUTPUT表示這是一個輸出參數,可以把存儲過程執行的結果信息返回應用程序。
default用於指定參數的默認值。
RECOMPILE選項表示重新編譯該存儲過程。該選項只是在需要的時候才使用,例如經常需要改變資料庫模式時。
ENCRYPTION選項用來加密創建存儲過程的文本,防止他人查看。 選項FOR
REPLICATION主要用於復制過程中。注意,該選項不能和選項RECOMPILE同時使用。
AS是一個關鍵字,表示其後的內容是存儲過程的語句。參數sql-statement[…n]表示在一個存儲過程中可以包含多個Transact-SQL語句。
2、存儲過程的優點 在頻繁訪問資料庫的系統中,開發者都樂於使用存儲過程,這與存儲過程的下列優點是分不開的。 ⑴
存儲過程可以與其他應用程序共享應用程序的邏輯,從而確保一致的數據訪問和操縱。 ⑵
存儲過程提供了一種安全機制。如果用戶被授予執行存儲過程許可權,那麼即使該用戶沒有訪問在執行該存儲過程中所參考的表或視圖的許可權,該用戶也可以完全執行該存儲過程而不受到影響。因此,可以創建存儲過程來完成所有的增加、刪除等操作,並且可以通過編程式控制制上述操作中對信息的訪問許可權。
⑶
存儲過程執行速度快,便於提高系統的性能。由於存儲過程在第一次執行之後,其執行規劃就駐存在過程高速緩沖存儲區中,在以後的操作中,只需從過程高速緩沖存儲區中調用編譯好的二進制形式存儲過程來執行。
⑷
使用存儲過程可以減少網路傳輸時間。如果有一千條Transact-SQL語句的命令,一條一條地通過網路在客戶機和伺服器之間傳送,那麼這種傳輸所耗費的時間將很長。但是,如果把這一千條Transact-SQL語句的命令寫成一條較為復雜的存儲過程命令,這時在客戶機和伺服器之間網路傳輸所需的時間就會大大減少。
SQL Server 2000資料庫存儲過程的調用
VB作為當今應用極為普遍的資料庫客戶端開發工具之一,對客戶端應用程序調用伺服器端存儲過程提供了強大的支持。特別是隨著VB6.0的推出,VB客戶端應用程序可以方便地利用ADO的對象和集合來實現對資料庫存儲過程的調用。
在筆者編寫的科技檔案管理系統中,就是採用VB作為開發平台,採用SQL
Server2000資料庫管理數據,在這個科技檔案管理系統中有海量的數據,並且對資料庫有頻繁的訪問,利用存儲過程訪問資料庫節省了執行時間,大大提高了系統的性能。
1、ADO簡介 ADO控制項(也稱為ADO Data控制項)與VB固有的Data控制項相似。使用ADO Data控制項,可以利用Microsoft
ActiveX Data Objects(ADO)快速建立資料庫綁定控制項和數據提供者之間的連接。 ADO Data控制項可以實現以下功能:
·連接一個本地資料庫或遠程資料庫。
·打開一個指定的資料庫表,或定義一個基於結構化查詢語言(SQL)的查詢、存儲過程或該資料庫中的表的視圖的記錄集合。
·將數據欄位的數值傳遞給數據綁定控制項,可以在這些控制項中顯示或更改這些數值。 ·添加新的記錄,或根據更改顯示在綁定的控制項中的數據來更新一個資料庫。
2、資料庫的連接 資料庫的連接可通過ADO控制項實現,為此,必須在工程部件中選擇Microsoft ADO Data Control 6.0
(OLEDB),然後在窗體中添加ADO控制項。利用ADO連接資料庫有兩種方法,具體如下。 1) 通過ADODC屬性頁實現連接
在ADODC屬性頁中選擇生成按鈕,進入數據鏈接屬性對話框;然後選擇該對話框中的連接屬性頁,選擇或輸入伺服器名稱和資料庫等重要信息;最後測試連接,連接成功後,按確定按鈕,返回到屬性頁對話框,可獲得連接字元串,如下例:
Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial
Catalog=Science_File;Data Source=Data_Server
其中sa是用戶名;Science_File是資料庫名;Data_Server是資料庫名。 通過下列語句,即可連接到指定的資料庫:
dim odbcstr as String, adocon As New ADODB.Connection
odbcstr
= "Provider=SQLOLEDB.1;Persist Security Info=False;User
ID=sa;Initial Catalog=Science_File;Data Source=Data_Server"
adocon.Open odbcstr '連接到資料庫 2) 直接使用連接語句實現 連接資料庫的語句如下:
Dim ado as ADODC
ado.ConnectionString
= "Provider=SQLOLEDB.1;Password=" & User_Pwd
& ";Persist Security Info=True;User ID="
& User_Name & ";Initial Catalog="
& Data_Name & ";Data Source="
& server_name
其中User-Pwd是用戶密碼;User_Name是用戶名;Data_Name是資料庫名;server_name是伺服器名。
連接資料庫成功後就可以調用存儲過程執行操作。 3、存儲過程的調用
假設有一個名為doc_ProcName存儲過程,該存儲過程有一個輸入參數,一個輸出參數。 1) 直接傳遞參數調用存儲過程
直接傳遞參數方法主要通過以下幾個步驟來實現: (1) 通過ADODB的Connection對象打開與數據源的連接; (2)
通過ActiveConnection指定Command對象當前所屬的Connection對象; (3)
通過CommandText屬性設置Command對象的源,即要調用的存儲過程; (4)
通過CommandType屬性確定Command對象的源類型,如果源類型為存儲過程CommandType即為adCmdStoredProc;
(5)
通過Command對象的Parameters集合向所調用的存儲過程傳遞參數,其中對象Parameters(0)為執行存儲過程的返回值,返回值為0則執行存儲過程成功;
(6) 通過Eexecute方法執行在 CommandText 屬性中指定的存儲過程。 以存儲過程doc_ProcName為例,關鍵代碼如下:
Dim strS As String '定義一變數
Dim adoconn As New ADODB.Connection 'Connection 對象代表了打開與數據源的連接。
Dim adocomm As New ADODB.Command 'Command 對象定義了將對數據源執行的指定命令。
Dim ReturnValue As Integer '調用存儲過程的返回值
adoconn.ConnectionString = Adodc1.ConnectionString 'Adodc1為窗體中的ADO控制項,並已成功連接資料庫
adoconn.Open
Set adocomm.ActiveConnection = adoconn '指示指定的 Command對象當前所屬的 Connection對象。
adocomm.CommandText = "doc_ProcName" '設置Command對象源。
adocomm.CommandType = adCmdStoredProc '通知提供者CommandText屬性有什麼,它可能包括Command對象的源類型。設置這個屬性優化了該命令的執行。
adocomm.Parameters(1) = "1"
adocomm.Parameters(2) = "OutputParameters" 'OutputParameters可以為任意的字元串或數字
adocomm.Execute
ReturnValue = adocomm.Parameters(0) '存儲過程的返回值,返回0則成功執行。
strS = adocomm.Parameters(2) '把存儲過程的輸出參數的值賦給變數strS 2) 追加參數法調用存儲過程 追加參數通過CreateParameter方法,用來指定屬性創建新的Parameter對象。具體語法如下:
Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value) ·Name 可選,字元串,代表 Parameter 對象名稱。
·Type 可選,長整型值,指定 Parameter 對象數據類型。
·Direction 可選,長整型值,指定 Parameter 對象類型。
·Size 可選,長整型值,指定參數值最大長度(以字元或位元組數為單位)。
·Value
可選,變體型,指定 Parameter 對象值。
這種方法與上面一種方法的分別主要在於,追加參數的方法在向存儲過程傳遞參數時,這種方法首先通過CreateParameter方法為存儲過程創建參數,然後通過Append方法將創建的參數追加到Parameters集合中去。
仍然以存儲過程doc_ProcName的調用為例,關鍵代碼如下:
Dim mRst As ADODB.Recordset 'Recordset 對象表示的是來自基本表或命令執行結果的記錄全集。
Dim prm As ADODB.Parameter 'Parameter 對象代表參數或與基於參數化查詢或存儲過程的Command 對象相關聯的參數。
adoconn.ConnectionString = Adodc1.ConnectionString
adoconn.Open
Set adocomm.ActiveConnection = adoconn
adocomm.CommandText = "doc_ProcName"
adocomm.CommandType = adCmdStoredProc
Set prm = adocomm.CreateParameter("parameter1", adTinyInt, adParamInput, , "1")
adocomm.Parameters.Append prm
Set prm = adocomm.CreateParameter("parameter2", adInteger, adParamOutput)
adocomm.Parameters.Append prm
Set mRst = adocomm.Execute
ReturnValue = adocomm.Parameters(0)
⑻ SQL 存儲過程建立和使用方法
Sql Server的存儲過程是一個被命名的存儲在伺服器上的Transacation-Sql語句集合,是封裝重復性工作的一種方法,它支持用戶聲明的變數、條件執行和其他強大的編程功能。 存儲過程相對於其他的資料庫訪問方法有以下的優點: (1)重復使用。存儲過程可以重復使用,從而可以減少資料庫開發人員的工作量。 (2)提高性能。存儲過程在創建的時候就進行了編譯,將來使用的時候不用再重新編譯。一般的SQL語句每執行一次就需要編譯一次,所以使用存儲過程提高了效率。 (3)減少網路流量。存儲過程位於伺服器上,調用的時候只需要傳遞存儲過程的名稱以及參數就可以了,因此降低了網路傳輸的數據量。 (4)安全性。參數化的存儲過程可以防止SQL注入式的攻擊,而且可以將Grant、Deny以及Revoke許可權應用於存儲過程。 存儲過程一共分為了三類:用戶定義的存儲過程、擴展存儲過程以及系統存儲過程。 其中,用戶定義的存儲過程又分為Transaction-SQL和CLR兩種類型。 Transaction-SQL 存儲過程是指保存的Transaction-SQL語句集合,可以接受和返回用戶提供的參數。 CLR存儲過程是指對.Net Framework公共語言運行時(CLR)方法的引用,可以接受和返回用戶提供的參數。他們在.Net Framework程序集中是作為類的公共靜態方法實現的。(本文就不作介紹了) 創建存儲過程的語句如下:Code
CREATE { PROC | PROCEDURE } [schema_name.] procere_name [ ; number ]
[ { @parameter [ type_schema_name. ] data_type }
[ VARYING ] [ = default ] [ [ OUT [ PUT ]
] [ ,n ]
[ WITH <procere_option> [ ,n ]
[ FOR REPLICATION ]
AS { <sql_statement> [;][ n ] | <method_specifier> }
[;]
<procere_option> ::=
[ ENCRYPTION ]
[ RECOMPILE ]
[ EXECUTE_AS_Clause ]
<sql_statement> ::=
{ [ BEGIN ] statements [ END ] }
<method_specifier> ::=
EXTERNAL NAME assembly_name.class_name.method_name [schema_name]: 代表的是存儲過程所屬的架構的名稱 例如: Create Schema yangyang8848
Go
Create Proc yangyang8848.AllGoods
As Select * From Master_Goods
Go 執行:Exec AllGoods 發生錯誤。 執行:Exec yangyang8848.AllGoods 正確執行。 [;Number]: 用於對同名過程進行分組的可選整數。使用一個 DROP PROCEDURE 語句可將這些分組過程一起刪除。 例如: Create Proc S1 ;1
AS
Select * From Master_Goods
Go
Create Proc S1 ;2
As
Select * From Master_Location
Go 創建完畢了兩個存儲過程。它們在同一個組S1里,如果執行Exec S1 則存儲過程默認執行 Exec S1 ;1 。如果我們想得到所有據點信息則需要執行Exec S1 ;2。當我們要刪除存儲過程的時候,只能執行Drop Exec S1 則該組內所有的存儲過程被刪除。 [@ parameter]: 存儲過程中的參數,除非將參數定義的時候有默認值或者將參數設置為等於另一個參數,否則用戶必須在調用存儲過程的時候為參數賦值。 存儲過程最多有2100個參數。 例如: Create Proc yangyang8848.OneGoods
@GoodsCode varchar(10)
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Go 調用的代碼: Declare @Code varchar(10)
Set @Code = '0004'
Exec yangyang8848.OneGoods @Code 在參數的後邊加入Output 表明該參數為輸出參數。 Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) output,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go 調用方法:
Declare @VV2 varchar(10)
Exec yangyang8848.OneGoods @Code out 注意:如果存儲過程的兩個參數一個有默認值一個沒有,那麼我們要把有默認值得放在後邊,不然會出問題哦~~ 細心的朋友,可能看到上邊的語句有一些不同,比如,存儲過程用的是output,而調用語句用的是out。我要告訴您,兩者是一樣的。 [RECOMPILE]:指示資料庫引擎 不緩存該過程的計劃,該過程在運行時編譯。如果指定了 FOR REPLICATION,則不能使用此選項。對於 CLR 存儲過程,不能指定 RECOMPILE。 這個說一個非常好用的函數 OBJECT_ID :返回架構范圍內對象的資料庫對象標識號。 例如:我們創建存儲過程時,可以如下寫代碼 If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011'
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go 針對於上邊的這個存儲過程,我們調用以下SQL查詢 Select definition From sys.sql_moles
Where object_id = Object_ID('yangyang8848.OneGoods'); 我們是可以查到結果的。 可是如果我們對該存儲過程加入[ ENCRYPTION ] 那麼你將無法看到任何結果 If Object_ID('yangyang8848.OneGoods') Is Not Null
Drop Proc yangyang8848.OneGoods
Go Create Proc yangyang8848.OneGoods
@GoodsCode2 varchar(10) out,@GoodsCode varchar(10) = '0011' With Encryption
As
Select * From Master_Goods Where GoodsCode = @GoodsCode
Set @GoodsCode2 = '0005'
Go</SPAN> 然後我們查詢 sys.sql_moles 目錄視圖,將返回給你Null。</p> 然後我們執行以下SQL: Exec sp_helptext 'yangyang8848.OneGoods' 你將得到以下結果:The text for object 'yangyang8848.OneGoods' is encrypted. 說到這里你應該明白了,參數[ ENCRYPTION ]:是一種加密的功能, 將 CREATE PROCEDURE 語句的原始文本轉換為模糊格式。模糊代碼的輸出在 SQL Server 2005 的任何目錄視圖中都不能直接顯示。對系統表或資料庫文件沒有訪問許可權的用戶不能檢索模糊文本。但是,可通過 DAC 埠訪問系統表的特權用戶或直接訪問資料庫文件的特權用戶可使用此文本。此外,能夠向伺服器進程附加調試器的用戶可在運行時從內存中檢索已解密的過程。 前兩天寫了一篇關於游標的介紹文章 ,下邊寫一個例子,將游標與存儲過程一起使用上: If Object_ID('dbo.GetMasterGoods') Is Not Null
Drop Proc dbo.GetMasterGoods
Go Create Proc GetMasterGoods
@MyCursor Cursor Varying Output
With Encryption
As
Set @MyCursor = Cursor
For
Select GoodsCode,GoodsName From Master_Goods
Open @MyCursor
Go --下邊建立另外一個存儲過程,用於遍歷游標輸出結果 Create Proc GetAllGoodsIDAndName
As Declare @GoodsCode varchar(18)
Declare @GoodsName nvarchar(20)
Declare @MasterGoodsCursor Cursor
Exec GetMasterGoods @MasterGoodsCursor out
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
While(@@Fetch_Status = 0)
Begin
Begin
Print @GoodsCode + ':' + @GoodsName
End
Fetch Next From @MasterGoodsCursor
InTo @GoodsCode,@GoodsName
End
Close @MasterGoodsCursor
Deallocate @MasterGoodsCursor
Go 最後執行Exec GetAllGoodsIDAndName結果為以下內容 0003:品0003
0004:品0004
0005:123123
0006:品0006
0007:品0007
0008:品0008
0009:品0009
0010:品0010
0011:品0011
0012:品0012
0013:品0013
0014:品0014
⑼ 資料庫存儲過程怎麼編寫
第一步:點擊資料庫下的「可編程性」,選擇「存儲過程」,點擊滑鼠右鍵,選擇「新建存儲過程」
第二步:在create PROCEDURE 後 輸入存儲過程的名字,緊跟著的就是定義存儲過程的參數,接下來就可以去編寫自己所需要組裝的存儲過程語句了
第三步: 編譯存儲過程,在工具欄上按下執行按鈕,如果沒有錯誤,就編寫成功了。
第四步:調用:在sqlserver的語句查詢框中,輸入exec 存儲過程名 參數,執行就可以了。
基本語法格式如下:中括弧帶的是可選項
create proc | procere pro_name
[{@參數數據類型} [=默認值] [output],
{@參數數據類型} [=默認值] [output],
....
]
as
begin
SQL_statements
--業務處理
end
⑽ 修改存儲過程的sql語句
alter procere [Name]