存儲過程是指封裝了可重用代碼的模塊或常式。存儲過程可以接受輸入參數、向客戶端返回表格或標量結果和消息、調用數據定義語言 (DDL) 和數據操作語言 (DML) 語句,然後返回輸出參數。在 SQL Server 2005 中,存儲過程有兩種類型:Transact-SQL 或 CLR。
Transact-SQL
Transact-SQL 存儲過程是指保存的 Transact-SQL 語句集合,可以接受和返回用戶提供的參數。例如,存儲過程中可能包含根據客戶端應用程序提供的信息在一個或多個表中插入新行所需的語句。存儲過程也可能從資料庫向客戶端應用程序返回數據。
CLR
CLR 存儲過程是指對 Microsoft .NET Framework 公共語言運行時 (CLR) 方法的引用,可以接受和返回用戶提供的參數。它們在 .NET Framework 程序集中是作為類的公共靜態方法實現的。
2. oracle SQL語句中怎麼樣調用存儲過程
PL/SQL是ORACLE對標准資料庫語言的擴展,ORACLE公司已經將PL/SQL整合到ORACLE 伺服器和其他工具中了,近幾年中更多的開發人員和DBA開始使用PL/SQL,本文將講述PL/SQL基礎語法,結構和組件、以及如何設計並執行一個PL/SQL程序。
PL/SQL的優點
從版本6開始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的優點以及其獨有的數據管理的便利性,那麼你很難想像ORACLE缺了PL/SQL的情形。PL/SQL 不是一個獨立的產品,他是一個整合到ORACLE伺服器和ORACLE工具中的技術,可以把PL/SQL看作ORACLE伺服器內的一個引擎,sql語句執行者處理單個的sql語句,PL/SQL引擎處理PL/SQL程序塊。當PL/SQL程序塊在PL/SQL引擎處理時,ORACLE伺服器中的SQL語句執行器處理pl/sql程序塊中的SQL語句。
PL/SQL的優點如下:
. PL/SQL是一種高性能的基於事務處理的語言,能運行在任何ORACLE環境中,支持所有數據處理命令。通過使用PL/SQL程序單元處理SQL的數據定義和數據控制元素。
. PL/SQL支持所有SQL數據類型和所有SQL函數,同時支持所有ORACLE對象類型
. PL/SQL塊可以被命名和存儲在ORACLE伺服器中,同時也能被其他的PL/SQL程序或SQL命令調用,任何客戶/伺服器工具都能訪問PL/SQL程序,具有很好的可重用性。
. 可以使用ORACLE數據工具管理存儲在伺服器中的PL/SQL程序的安全性。可以授權或撤銷資料庫其他用戶訪問PL/SQL程序的能力。
. PL/SQL代碼可以使用任何ASCII文本編輯器編寫,所以對任何ORACLE能夠運行的操作系統都是非常便利的
. 對於SQL,ORACLE必須在同一時間處理每一條SQL語句,在網路環境下這就意味作每一個獨立的調用都必須被oracle伺服器處理,這就佔用大量的伺服器時間,同時導致網路擁擠。而PL/SQL是以整個語句塊發給伺服器,這就降低了網路擁擠。
PL/SQL塊結構
PL/SQL是一種塊結構的語言,組成PL/SQL程序的單元是邏輯塊,一個PL/SQL 程序包含了一個或多個邏輯塊,每個塊都可以劃分為三個部分。與其他語言相同,變數在使用之前必須聲明,PL/SQL提供了獨立的專門用於處理異常的部分,下面描述了PL/SQL塊的不同部分:
聲明部分(Declaration section)
聲明部分包含了變數和常量的數據類型和初始值。這個部分是由關鍵字DECLARE開始,如果不需要聲明變數或常量,那麼可以忽略這一部分;需要說明的是游標的聲明也在這一部分。
執行部分(Executable section)
執行部分是PL/SQL塊中的指令部分,由關鍵字BEGIN開始,所有的可執行語句都放在這一部分,其他的PL/SQL塊也可以放在這一部分。
異常處理部分(Exception section)
這一部分是可選的,在這一部分中處理異常或錯誤,對異常處理的詳細討論我們在後面進行。
PL/SQL塊語法
[DECLARE]
---declaration statements
BEGIN
---executable statements
[EXCEPTION]
---exception statements
END
PL/SQL塊中的每一條語句都必須以分號結束,SQL語句可以使多行的,但分號表示該語句的結束。一行中可以有多條SQL語句,他們之間以分號分隔。每一個PL/SQL塊由BEGIN或DECLARE開始,以END結束。注釋由--標示。
PL/SQL塊的命名和匿名
PL/SQL程序塊可以是一個命名的程序塊也可以是一個匿名程序塊。匿名程序塊可以用在伺服器端也可以用在客戶端。
命名程序塊可以出現在其他PL/SQL程序塊的聲明部分,這方面比較明顯的是子程序,子程序可以在執行部分引用,也可以在異常處理部分引用。
PL/SQL程序塊可背獨立編譯並存儲在資料庫中,任何與資料庫相連接的應用程序都可以訪問這些存儲的PL/SQL程序塊。ORACLE提供了四種類型的可存儲的程序:
. 函數
. 過程
. 包
. 觸發器
函數
函數是命名了的、存儲在資料庫中的PL/SQL程序塊。函數接受零個或多個輸入參數,有一個返回值,返回值的數據類型在創建函數時定義。定義函數的語法如下:
FUNCTION name [{parameter[,parameter,...])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name]
過程
存儲過程是一個PL/SQL程序塊,接受零個或多個參數作為輸入(INPUT)或輸出(OUTPUT)、或既作輸入又作輸出(INOUT),與函數不同,存儲過程沒有返回值,存儲過程不能由SQL語句直接使用,只能通過EXECUT命令或PL/SQL程序塊內部調用,定義存儲過程的語法如下:
PROCEDURE name [(parameter[,parameter,...])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]
包(package)
包其實就是被組合在一起的相關對象的集合,當包中任何函數或存儲過程被調用,包就被載入入內存中,包中的任何函數或存儲過程的子程序訪問速度將大大加快。
包由兩個部分組成:規范和包主體(body),規范描述變數、常量、游標、和子程序,包體完全定義子程序和游標。
觸發器(trigger)
觸發器與一個表或資料庫事件聯系在一起的,當一個觸發器事件發生時,定義在表上的觸發器被觸發。
變數和常量
變數存放在內存中以獲得值,能被PL/SQL塊引用。你可以把變數想像成一個可儲藏東西的容器,容器內的東西是可以改變的。
聲明變數
變數一般都在PL/SQL塊的聲明部分聲明,PL/SQL是一種強壯的類型語言,這就是說在引用變數前必須首先聲明,要在執行或異常處理部分使用變數,那麼變數必須首先在聲明部分進行聲明。
聲明變數的語法如下:
Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]
注意:可以在聲明變數的同時給變數強制性的加上NOT NULL約束條件,此時變數在初始化時必須賦值。
給變數賦值
給變數賦值有兩種方式:
. 直接給變數賦值
X:=200;
Y=Y+(X*20);
. 通過SQL SELECT INTO 或FETCH INTO給變數賦值
SELECT SUM(SALARY),SUM(SALARY*0.1)
INTO TOTAL_SALARY,TATAL_COMMISSION
FROM EMPLOYEE
WHERE DEPT=10;
常量
常量與變數相似,但常量的值在程序內部不能改變,常量的值在定義時賦予,,他的聲明方式與變數相似,但必須包括關鍵字CONSTANT。常量和變數都可被定義為SQL和用戶定義的數據類型。
ZERO_VALUE CONSTANT NUMBER:=0;
這個語句定了一個名叫ZERO_VALUE、數據類型是NUMBER、值為0的常量。
標量(scalar)數據類型
標量(scalar)數據類型沒有內部組件,他們大致可分為以下四類:
. number
. character
. date/time
. boolean
3. SET集合容器的存儲結構是什麼樣子呢求個大神解析下!!
HashSet 中的集合元素實際上由 HashMap 的 key 來保存,而 HashMap 的 value 則存儲了一個 PRESENT。其實你要看底層最好閱讀API源碼,如下
publicclassHashSet<E>
extendsAbstractSet<E>
implementsSet<E>,Cloneable,java.io.Serializable
{
//使用HashMap的key保存HashSet中所有元素
privatetransientHashMap<E,Object>map;
//定義一個虛擬的Object對象作為HashMap的value
=newObject();
...
//初始化HashSet,底層會初始化一個HashMap
publicHashSet()
{
map=newHashMap<E,Object>();
}
//以指定的initialCapacity、loadFactor創建HashSet
//其實就是以相應的參數創建HashMap
publicHashSet(intinitialCapacity,floatloadFactor)
{
map=newHashMap<E,Object>(initialCapacity,loadFactor);
}
publicHashSet(intinitialCapacity)
{
map=newHashMap<E,Object>(initialCapacity);
}
HashSet(intinitialCapacity,floatloadFactor,booleanmmy)
{
map=newLinkedHashMap<E,Object>(initialCapacity
,loadFactor);
}
//調用map的keySet來返回所有的key
publicIterator<E>iterator()
{
returnmap.keySet().iterator();
}
//調用HashMap的size()方法返回Entry的數量,就得到該Set里元素的個數
publicintsize()
{
returnmap.size();
}
//調用HashMap的isEmpty()判斷該HashSet是否為空,
//當HashMap為空時,對應的HashSet也為空
publicbooleanisEmpty()
{
returnmap.isEmpty();
}
//調用HashMap的containsKey判斷是否包含指定key
//HashSet的所有元素就是通過HashMap的key來保存的
publicbooleancontains(Objecto)
{
returnmap.containsKey(o);
}
//將指定元素放入HashSet中,也就是將該元素作為key放入HashMap
publicbooleanadd(Ee)
{
returnmap.put(e,PRESENT)==null;
}
//調用HashMap的remove方法刪除指定Entry,也就刪除了HashSet中對應的元素
publicbooleanremove(Objecto)
{
returnmap.remove(o)==PRESENT;
}
//調用Map的clear方法清空所有Entry,也就清空了HashSet中所有元素
publicvoidclear()
{
map.clear();
}
...
}
由上面源程序可以看出,HashSet 的實現其實非常簡單,它只是封裝了一個 HashMap 對象來存儲所有的集合元素,所有放入 HashSet
中的集合元素實際上由 HashMap 的 key 來保存,而 HashMap 的 value 則存儲了一個 PRESENT,它是一個靜態的 Object 對象。
4. 如何將資料庫中所有數據存入數組
放到數組我不知道為什麼這么做,你資料庫的類型都是一樣嗎?要是整型和字元串你可以放一個數組里?
你可以用結果集取出來放到list集合里
反正放到一個容器里就可以了,最好用個泛型
如:User實體類,你先可以封裝到populate的方法里
當然方法名你隨便取,
String
sql
=
"select
*
from
t_user";
List
userlist
=
null;
try{
Connection
conn
=
this.getConnection;
PreparedStatement
pst
=
conn.PreparedStatement
(sql);
ResultSet
rs
=
pst.executeQuery();
userlist
=
new
ArrayList
();
while(rs.next()){
User
user
=
new
User();
user.setId(rs.getInt("id"));
user.setCode(rs.getString("code"));
userlist.add(user);
}
this.getClose(conn,pst,rs);
}catch(Exception
e){
printStackTrace();
}
return
userlist;
我手打的個別打錯了你在開發工具里看看
5. sql 存儲過程可以存儲集合嗎
SQL Server 通過 RETURN TABLE 來實現。
1> CREATE FUNCTION getHelloWorld()
2> RETURNS TABLE
3> AS
4> RETURN
5> SELECT 'Hello' AS A, 'World' AS B;
6> GO
1> SELECT * FROM getHelloWorld();
2> go
A B
6. sql一個表只能儲存在一個文件中嗎
不一定。
在SQL語言中,一個基本表可以跨多個存儲文件存放,一個存儲文件可以存放一個或多個基本表。
存儲過程和函數與Java中的方法很相似,存儲過程就是一組預先編譯好的SQL語句的集合,它可以提高代碼的可用性,還可以減少編譯次數,也減少了與資料庫伺服器的連接次數,提高了效率。存儲過程應該先創建後調用。
7. 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
8. Windows Server 2016第三版技術預覽帶來了哪些新特性
隨著Windows Server 2016和System Center2016第 三版技術預覽的發布,我們也迎來了全新的里程碑。藉助這兩個分別針對混合雲和數據中心的解決方案的推出,微軟希望能夠幫助用戶將雲計算的靈活性引入企業。 對於微軟來說,這些里程碑式的產品在公司發展歷程中扮演了重要角色,它讓我們有機會了解各個用戶群體的看法。我們也希望用戶能夠從一開始就了解我們推出此 產品的初衷、熟悉新的功能,並了解這項新技術將如何改進你的業務。
對於用戶來說,此次的亮點是首次發布的Windows Server容器。這是將容器技術帶入WindowsServer生態系統的第一步,我們對隨之而來的可能性感到非常興奮。你可能已經看到容器技術的發展勢頭,這種新技術可以簡化應用的開發與部署。我們致力於讓容器技術成為現代應用平台的一部分,並將其整合在2016年推出的數據中心解決方案中,提供給我們的客戶。您可以通過MikeNeil的博客了解有關於容器技術創新的更多信息。
容器僅僅是Windows Server和SystemCenter技術預覽版眾多新特性中的一個。除此之外,我們還增強了上一個預覽版中的功能,並添加了一些新的特性,供你第一時間進行評估。
Nano Server
作為最小的內存部署選項,就像在技術預覽版2階段一樣,Nano Server可以被安裝在物理主機或虛擬機上。新的EmergencyManagement Console讓用戶可以在NanoServer控制台中直接查看和修復網路配置。此外,我們還提供PowerShell腳本用於創建一個運行NanoServer的Azure虛擬機。從應用的角度來說,你現在可以使用CoreCLR運行ASP.Netv5應用。總而言之,我們增加了重大功能以擴展Nano Server能力,而這一切的更新都建立在維持原有內存佔用的基礎之上。
軟體定義網路
在第三版技術預覽中,你會發現絕大多數網路功能是新增的。我們引入了用於編程政策的可擴展網路控制器、用於高可用性和高性能的L4負載均衡器、用於混合連接的增強網關,以及融合了RDMA流量和租戶流量的底層網路結構。在此次發布的預覽版中,你將首次體驗到我們在Azure中使用的核心網路功能套件和SDN架構。
安全
此次發布的預覽版增加了對於Hyper-V的投入:包括某些用於下一版本的安全創新。虛擬機隔離是我們承諾的核心,即幫助你保護共享環境中的資源。現在,你可以通過一個署名模板測試創建一個屏蔽虛擬機,以及該新屏蔽虛擬機的其他功能。你還可以發現WindowsServer扮演的全新角色——Host Guardian Service,管理員可以識別合法主機。
工作負載支持
● 用於增強關鍵工作復雜支持的附加特性和功能包括:
● 藉助擁有OpenGL支持的Remote Desktop Services提高應用兼容性。
● 藉助Storage Replica,對面向延展集群的站點感知而改進業務連續性場景。
● 通過為SQL Server集群刪除特定域容器而增加靈活性。
管理
在System Center 2016第三版技術預覽版中,增強的特性簡化了WindowsServer中新功能的管理。包括對Virtual Machine Manager的改進,如支持集群節點的滾動升級,支持NanoServer作為主機和文件伺服器。通過輕松管理隔離虛擬機和受保護主機,你還可以充分利用我們針對共享環境的安全增強功能。在存儲方面,你會看到改進的功能,以保持滿足預期的端對端服務質量(QoS)和更快速的數據(使用存儲分層)檢索。在OperationsManager中,我們則側重於通過管理包的可發現性,和使用PowerShel自動化維護窗口的能力,來提升用戶體驗。
此外,我們還發布了面向Windows 10客戶端的Remote Server AdministrationTools(RSAT),實現對Windows Server 2016技術預覽版、Windows Server 2012R2和Windows Server 2012的遠程管理。
更多的新特性待你評估,詳情可查看Experience Guides;我們還歡迎各位參加我們的User Voice計劃,參與整個開發過程。目前Windows Server 2016第三版技術預覽及System Center 2016第三版技術預覽都已經開放下載。期待來自你的建議。
注意:以上提到的軟體、特性及功能均基於預覽版,實際發布時可能會有所不同。
9. SQL資料庫怎樣使用表組織數據
我們使用SQL資料庫其實就是使用很多表,資料庫是由表組成的,而數據也是以表的形式展現出來的,表是列的集合也是信息數據的容器,很多表就構成了資料庫。這篇文章講解如何使用表組織數據,使資料庫的結構完整性。下面我們採用個案例:建立學生資料庫表來講解如何創建資料庫使用表組織數據。
10. 「SQL Server的存儲過程」是什麼意思
在使用 Microsoft® SQL Server™ 2000 創建應用程序時,Transact-SQL 編程語言是應用程序和 SQL Server 資料庫之間的主要編程介面。使用 Transact-SQL 程序時,可用兩種方法存儲和執行程序。可以在本地存儲程序,並創建向 SQL Server 發送命令並處理結果的應用程序;也可以將程序在 SQL Server 中存儲為存儲過程,並創建執行存儲過程並處理結果的應用程序。
SQL Server 中的存儲過程與其它編程語言中的過程類似,原因是存儲過程可以:
接受輸入參數並以輸出參數的形式將多個值返回至調用過程或批處理。
包含執行資料庫操作(包括調用其它過程)的編程語句。
向調用過程或批處理返回狀態值,以表明成功或失敗(以及失敗原因)。
可使用 Transact-SQL EXECUTE 語句運行存儲過程。存儲過程與函數不同,因為存儲過程不返回取代其名稱的值,也不能直接用在表達式中。
使用 SQL Server 中的存儲過程而不使用存儲在客戶計算機本地的 Transact-SQL 程序的優勢有:
允許模塊化程序設計。
只需創建過程一次並將其存儲在資料庫中,以後即可在程序中調用該過程任意次。存儲過程可由在資料庫編程方面有專長的人員創建,並可獨立於程序源代碼而單獨修改。
允許更快執行。
如果某操作需要大量 Transact-SQL 代碼或需重復執行,存儲過程將比 Transact-SQL 批代碼的執行要快。將在創建存儲過程時對其進行分析和優化,並可在首次執行該過程後使用該過程的內存中版本。每次運行 Transact-SQL 語句時,都要從客戶端重復發送,並且在 SQL Server 每次執行這些語句時,都要對其進行編譯和優化。
減少網路流量。
一個需要數百行 Transact-SQL 代碼的操作由一條執行過程代碼的單獨語句就可實現,而不需要在網路中發送數百行代碼。
可作為安全機制使用。
即使對於沒有直接執行存儲過程中語句的許可權的用戶,也可授予他們執行該存儲過程的許可權。
SQL Server 存儲過程是用 Transact-SQL 語句 CREATE PROCEDURE 創建的,並可用 ALTER PROCEDURE 語句進行修改。存儲過程定義包含兩個主要組成部分:過程名稱及其參數的說明,以及過程的主體(其中包含執行過程操作的 Transact-SQL 語句)。