SQLSERVER存儲過程的寫法格式規格 *****************************************************
*** author:Susan
*** date: 2005 / 08 / 05
*** expliation:如何寫存儲過程的格式及例子,有遊標的用法!
*** 本版:SQL SERVER 版!
******************************************************/
在存儲過程中的格式規格:
CREATE PROCEDURE XXX
參數1,
參數2……………
As
Declare
參數1,
參數2……………
Set參數1的初始值
Set參數2的初始值…………
Begin trascation
Commit trascation
Return
下面是一個例子
CREATE PROCEDURE TEST_2
@strTO VARCHAR ( 3 )
AS
DECLARE
@strUNIT_NAME VARCHAR ( 800 ),
@strSQL VARCHAR ( 8000 ),
@Link VARCHAR ( 1 ),
@Link1 VARCHAR ( 1 )
SET @strUNIT_NAME = ''
SET @strSQL = ''
SET @Link = ''
SET @Link1 = ''
BEGIN TRANSACTION
IF @strTO <> ''
BEGIN
UPDATE UNIT SET UNIT_NAME = REPLACE (UNIT_NAME, ' * ' , '' ) WHERE UNIT_CODE = @strTO
END
ELSE
BEGIN
UPDATE UNIT SET UNIT_NAME = UNIT_NAME + ' * ' WHERE UNIT_CODE = ' 011 '
END
IF @strTO <> ''
BEGIN
declare db cursor for -- 必需聲明在查詢的前面
SELECT UNIT_NAME FROM UNIT WHERE LEFT (UNIT_CODE, 2 ) = LEFT ( @strTO , 2 ) -- -取到相關資訊
END
ELSE
BEGIN
declare db cursor for -- 必需聲明在查詢的前面
SELECT UNIT_NAME FROM UNIT WHERE LEFT (UNIT_CODE, 2 ) = LEFT ( ' 011 ' , 2 ) -- -取到相關資訊
END
open db -- -開起取到的資訊
fetch next from db into @strUNIT_NAME -- -把第一筆放入@strUNIT_NAME中
while @@fetch_status = 0 -- -表示存在本筆資料
BEGIN -- --開始循環
set @strSQL = @strSQL + @Link1 + @Link + @strUNIT_NAME -- --設定儲存的值
fetch next from db into @strUNIT_NAME -- --進行下次循環
SET @Link = CHAR ( 13 ) + CHAR ( 10 )
SET @Link1 = ' , '
END -- --結束循環
close db -- -關閉資訊
deallocate db -- -移除資料指標參考
SELECT @strSQL
COMMIT TRANSACTION
RETURN 如果循環insert的例子
DECLARE @strLoginID VARCHAR ( 16 )
BEGIN
declare db cursor for
SELECT LoginID FROM dbo.s_Users WHERE len (UnitCoding) in ( 9 , 12 )
END
open db
fetch next from db into @strLoginID
while @@fetch_status = 0 BEGIN
insert into s_P_User
select @strLoginID ,LevelID from s_P_User where LoginID = ' aa '
fetch next from db into @strLoginID
END
close db
deallocate db 一、TRUNCATE
二、Select INTO 建表
把一個表中的資料複制到另外一個表中。
三、Insert INTO Select
四、補充:臨時表
臨時表存儲在系統資料庫tempdb中
臨時表會被系統隐式地丢棄
---------------------------------------------------------
五、存儲過程(**)
一、簡介:
存儲過程(Stored Procedure), 是一組為了完成特定功能的SQL 語句,集經編譯後
存儲在資料庫中,使用者通過指定存儲過程的名字并給出參數,如果該存儲過程帶有參數來執行
它,
在SQL Server 的系列版本中,存儲過程分為兩類:系統提供的存儲過程和使用者自定義存儲過程
。
系統SP,主要存儲master 資料庫中,并以sp_為字首并且系統存儲過程主要是從系統表中擷取
資訊,進而為系統管理者管理SQL Server。 使用者自定義存儲過程是由使用者建立,并能完成
某一特定功能,如:查詢使用者所需資料資訊的存儲過程。
存儲過程具有以下優點
1.存儲過程允許标準元件式程式設計(子產品化設計)
存儲過程在被建立以後,可以在程式中被多次調用,而不必重新編寫該存儲過程的SQL語句,而
且數
據庫專業人員可随時對存儲過程進行修改,但對應用程式源代碼毫無影響。因為應用程式源代
碼隻包含存
儲過程的調用語句,進而極大地提高了程式的可移植性。
2.存儲過程能夠實作快速的執行速度
如果某一操作包含大量的Transaction-SQL 代碼,,或分别被多次執行,那麼存儲過程要比批處理
的
執行速度快很多,因為存儲過程是預編譯的,在首次運作一個存儲過程時,查詢優化器對其進
行分析優
化,并給出最終被存在系統表中的執行計劃,而批處理的Transaction-SQL 語句在每次運作時
都要進行
編譯和優化,是以速度相對要慢一些。
3.存儲過程能夠減少網絡流量
對于同一個針對資料資料庫對象的操作,如查詢修改,如果這一操作所涉及到的Transaction-SQL
語句被組織成一存儲過程,那麼當在客戶計算機上調用該存儲過程時,網絡中傳送的隻是該調
用語句,否
則将是多條SQL 語句進而大大增加了網絡流量降低網絡負載。
4.存儲過程可被作為一種安全機制來充分利用
系統管理者通過,對執行某一存儲過程的權限進行限制,進而能夠實作對相應的資料通路權限的
限
制。
二、變量
@I
三、流程控制語句(if else | select case | while )
Select ... CASE 執行個體
DECLARE @iRet INT, @PKDisp VARCHAR(20)
SET @iRet = '1'
Select @iRet =
CASE
WHEN @PKDisp = '一' THEN 1
WHEN @PKDisp = '二' THEN 2
WHEN @PKDisp = '三' THEN 3
WHEN @PKDisp = '四' THEN 4
WHEN @PKDisp = '五' THEN 5
ELSE 100
END
四、存儲過程格式
建立存儲過程
Create Proc dbo.存儲過程名
存儲過程參數
AS
執行語句
RETURN
執行存儲過程
GO
*********************************************************/
-- 變量的聲明,sql裡面聲明變量時必須在變量前加@符号
DECLARE @I INT
-- 變量的指派,變量指派時變量前必須加set
SET @I = 30
-- 聲明多個變量
DECLARE @s varchar ( 10 ), @a INT
-- Sql 裡if語句
IF 條件 BEGIN
執行語句
END
ELSE BEGIN
執行語句
END
DECLARE @d INT
set @d = 1
IF @d = 1 BEGIN
-- 列印
PRINT ' 正确 '
END
ELSE BEGIN
PRINT ' 錯誤 '
END
-- Sql 裡的多條件選擇語句.
DECLARE @iRet INT , @PKDisp VARCHAR ( 20 )
SET @iRet = 1
Select @iRet =
CASE
WHEN @PKDisp = ' 一 ' THEN 1
WHEN @PKDisp = ' 二 ' THEN 2
WHEN @PKDisp = ' 三 ' THEN 3
WHEN @PKDisp = ' 四 ' THEN 4
WHEN @PKDisp = ' 五 ' THEN 5
ELSE 100
END
-- 循環語句
WHILE 條件 BEGIN
執行語句
END
DECLARE @i INT
SET @i = 1
WHILE @i < 1000000 BEGIN
set @i = @i + 1
END
-- 列印
PRINT @i
-- TRUNCATE 删除表中的所有行,而不記錄單個行删除操作,不能帶條件
TRUNCATE TABLE authors
-- Select INTO 從一個查詢的計算結果中建立一個新表。 資料并不傳回給用戶端,這一點和普通的
-- Select 不同。 新表的字段具有和 Select 的輸出字段相關聯(相同)的名字和資料類型。
select * into NewTable
from Uname
-- Insert INTO Select
-- 表ABC必須存在
-- 把表Uname裡面的字段Username複制到表ABC
Insert INTO ABC Select Username FROM Uname
-- 建立臨時表
Create TABLE # temp (
UID int identity ( 1 , 1 ) PRIMARY KEY ,
UserName varchar ( 16 ),
Pwd varchar ( 50 ),
Age smallint ,
Sex varchar ( 6 )
)
-- 打開臨時表
Select * from # temp
-- 存儲過程
-- 要建立存儲過程的資料庫
Use Test
-- 判斷要建立的存儲過程名是否存在
if Exists ( Select name From sysobjects Where name = ' csp_AddInfo ' And
type = ' P ' )
-- 删除存儲過程
Drop Procedure dbo.csp_AddInfo
Go
-- 建立存儲過程
Create Proc dbo.csp_AddInfo
-- 存儲過程參數
@UserName varchar ( 16 ),
@Pwd varchar ( 50 ),
@Age smallint ,
@Sex varchar ( 6 )
AS
-- 存儲過程語句體
insert into Uname (UserName,Pwd,Age,Sex)
values ( @UserName , @Pwd , @Age , @Sex )
RETURN
-- 執行
GO
-- 執行存儲過程
EXEC csp_AddInfo ' Junn.A ' , ' 123456 ' , 20 , ' 男 '