關於部落格
雨--是天空的眼淚 風--是蝴蝶的痴醉 雲--是水珠的嫵媚 光--是溫暖的慰藉 夜--是孤單的滋味 星--是墜跌的心碎 蹲下,是為了躍起。 後退,是為了向前跳得更遠。
  • 171475

    累積人氣

  • 4

    今日人氣

    0

    訂閱人氣

MS SQL Stored Procedure



其實並沒有想像中的困難
寫法和一般寫程式一樣


在看小範例之前
先來討論一下有關Stored Procedure的優缺點
為什麼要使用 Stored Procedure ?
用了有什麼好處?


主要列出以下幾項 ( 其他的就要麻煩 Google大師囉


優點
1. 可將一些商業性邏輯寫在 Stored Procedure 裡, 增加其隱蔽性, 安全性
2. Stored Procedure 是已經編譯過的, 所以執行效率快
3. 減少程式與資料庫的連結次數


缺點
1. 移植性差
2. 對Server的負擔較大


對沒使用過Stored Procedure的人
最容易可以感覺到的就是~ 第三點 - 減少程式與資料庫的連結次數
怎麼說呢?


舉一個例子
假設今天我們要搜尋的條件是


檢查某一使用者資料是否已存在
如果不存在, 則建立使用者資料
如果已存在, 則檢查使用者是否有購買記錄
如果有購買記錄, 判斷是否有送過金幣, 如果沒有, 則贈送一枚金幣
最後
如果加值金幣成功 則回傳 1 否 則回傳 0


以上 ( 可能例子不是太好, 請多包涵


若以傳統方式來做的話
程式和資料庫之間可能要互動個好幾次才能做完這些判斷


但如果是  Stored Procedure 呢?


來看看實際範例吧


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
-- =============================================
-- Author:  葉小誠
-- Create date: 2011/09/20
-- Description: AddCoin
-- =============================================
Create PROCEDURE [dbo].[AddCoin](@user_id nvarchar(50))
 -- Add the parameters for the stored procedure here
AS
BEGIN
 declare
 @result int

 SET NOCOUNT ON;
 
 set @result = 0
 
 IF EXISTS (SELECT top 1 uid FROM user WHERE uid = @user_id)
 BEGIN
  IF EXISTS (SELECT top 1 uid FROM order_tbl WHERE uid = @user_id)
  BEGIN
   INSERT INTO coin_tbl(uid, num) VALUES (@user_id, 1)
   set @result = 1
  END
 END
 ELSE
 BEGIN
  INSERT INTO user (uid) VALUES (@user_id)
 END

 select @result
END


若要新增一個 Stored Procedure
語法則是使用 Create PROCEDURE
若是要變更內容 則是 Alter PROCEDURE
在Stored Procedure裡
變數的宣告為 declare @ + 名稱 型態
如:declare @total int
指定變數值 可以使用 set @total = 1
或是 select @total=sum(price) from order_tbl


在C# 裡的呼叫方式為 EXEC AddCoin N'clay';


從範例就可以看出
除了平常在寫的SQL語法之外
更包含一些邏輯判斷
當然還有更多更深的應用
等大家去挖掘囉~





文:葉小誠

相簿設定
標籤設定
相簿狀態