sqlServer的存儲過程:
1. 不能返回表變量;
2. 限制少,可以執行對數據庫表的操作,可以返回數據集;
3. 可以return一個標量值,也可以省略return;
4. 存儲過程一般用在實現複雜的功能和數據操縱方面。
存儲過程是一個執行過程,可以有返回值:
(1) 創建帶output參數的存儲過程
CREATE PROCEDURE PR_Sum
@a int,
@b int,
@sum int output
AS
BEGIN
set @sum=@a+@b
END
(2) 創建Return返回值存儲過程
CREATE PROCEDURE PR_Sum2
@a int,
@b int
AS
BEGIN
Return @a+@b
END
1. Alter Procedure相對CreateProcedure的優點:
(1) ALTER PROC 期望找到現存的存儲過程,而CERATE不是。
(2) ALTER PROC 保留了已經建立的存儲過程的任何權限。它在系統對象中保留了相同的對象ID並允許保留依賴關係。
例如,如果過程A調用過程B,並刪除和重新創建了過程B,那麼就不能再看到這兩者之間的依賴關係。如果使用ALTER,則依賴關係依然存在。
(3) ALTER PROC 在其他對象上保留了任何依賴關係的信息,這些對象可以調用修改的存儲過程。
example:
ALTER PROCEDURE [dbo].[P_InitiateChaseTask] -- 使用P_InitiateChaseTask存儲過程
2. Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran來使用事務。
(1) begin tran表示開始事務;
(2) commit tran表示提交事務;
(3) rollback tran表示回滾事物.
example:
SET NOCOUNT ON; -- 不返回計數(語句影響的行數的信息);可提高程序性能
BEGIN TRAN -- 開啓事務
3. 定義變量,併爲變量賦值
example:
DECLARE @decl INT --定義int類型變量
SET @decl = 0 --將變量賦值爲0
DECLARE @careTable TABLE --定義一個臨時的表變量@careTable,使用完會自動刪除
( IsuseID BIGINT , --指定表字段信息
PlayTypeID INT ,
LotteryNumber VARCHAR(MAX) ,
Multiple INT ,
[Money] MONEY
)
(1) 聲明的變量都以@或@@爲前綴,表變量是變量的一種;
(2) 表的字段名如果與sql關鍵字衝突,要使用 [字段名] 進行處理;
(3) set賦值爲最基本的賦值方法,當然還可以使用select/update等語法進行賦值操作:
example:
SELECT @Balance = Balance , --將查詢結果Balance賦值給變量@Balance
@HandselTotal = HandselAmount
FROM T_Users --T_Users : 用戶表
WHERE SiteID = @SiteID
AND [ID] = @UserID
UPDATE T_Users
SET Balance = Balance - @ThisBalanceDebit ,
HandselAmount = HandselAmount - @ThisHandselDebit ,
WHERE [ID] = @UserID
4. INSERT INTO
(1) 常規插入
INSERT INTO T_UserDetails
( SiteID , UserID , OperatorType , [Money] , HandselAmount )
VALUES ( @SiteID ,
@UserID ,
dbo.F_GetDetailsOperatorType('追號凍結') , --獲取賬戶交易類型: when '追號凍結' then 103
@ThisBalanceDebit ,
@ThisHandselDebit
)
(2) 將一個表的數據添加到另一個表中
INSERT INTO @careTable --把臨時表#TempP_InitiateChaseTask相應字段的數據..複製到表變量@careTable中
(IsuseID, PlayTypeID, LotteryNumber, Multiple, [Money], SecrecyLevel, Share, BuyedShare, AssureShare )
SELECT
IsuseID, PlayTypeID, LotteryNumber, Multiple, [Money], SecrecyLevel, Share, BuyedShare, AssureShare
FROM
#TempP_InitiateChaseTask
DROP TABLE #TempP_InitiateChaseTask --將#TempP_InitiateChaseTask表 銷燬
5. sp_xml_preparedocument和sp_xml_removedocument
example:
DECLARE @Pointer INT -- 定義XML文檔的內部表式形式的文檔句柄
EXECUTE sp_xml_preparedocument @Pointer OUTPUT, @DetailXML --使用sp_xml_preparedocument讀取@DetailXML(文件)的xml數據
SELECT IsuseID, PlayTypeID, LotteryNumber, Multiple, [Money] ,
SecrecyLevel, Share, BuyedShare, AssureShare
INTO #TempP_InitiateChaseTask --將查詢結果存入臨時表#TempP_InitiateChaseTask中(#開頭)
FROM OPENXML (@Pointer,'/ChaseDetail/Isuse') --使用OPENXML獲取讀取的xml數據,,
--'/ChaseDetail/Isuse'爲XPath,獲取指定節點內容
WITH (IsuseID BIGINT, PlayTypeID INT, LotteryNumber VARCHAR(MAX), Multiple INT,
[Money] MONEY, SecrecyLevel INT,Share INT,BuyedShare INT,AssureShare INT ) --指定要獲取信息的字段
//以上執行完畢,臨時表#TempP_InitiateChaseTask中數據就是(解析)讀取的xml文檔的內容
EXEC sp_xml_removedocument @Pointer --刪除文檔句柄指定的 XML 文檔的內部表示方式並使該文檔句柄無效
6. SELECT TOP ( 1 ) 和 SELECT 1
example:
SELECT TOP ( 1 ) --查詢@careTable, 獲取符合條件的查詢結果的第一條記錄
@Numbers = LotteryNumber , --將查詢結果字段值賦給定義的變量@
@isusersiD = IsuseID ,
@Multiple2 = Multiple --若查詢的是臨時表或臨時表變量,則可以通過刪除SELECT TOP ( 1 )的記錄,來實現遍歷
FROM @careTable
IF NOT EXISTS ( SELECT 1 FROM #TempP_InitiateChaseTask ) --查看是否有記錄,一般用作判斷條件
7. 多表查詢
example:
SELECT @LotteryCount = COUNT(*)
FROM ( SELECT LotteryID
FROM ( SELECT b.LotteryID
FROM #TempP_InitiateChaseTask a
LEFT JOIN T_Isuses b --T_Isuses : 期號表
ON a.IsuseID = b.ID ) c --左連接 :返回包括左表中的所有記錄和右表中聯結字段相等的記錄
GROUP BY LotteryID ) d
8. ISNULL 和 REPLACE
example:
SET @UserHandselAmount = ( SELECT ISNULL(HandselAmount, 0) --使用指定的值替換 NULL
FROM dbo.T_Users
WHERE ID = @UserID )
--用第三個表達式替換第一個字符串表達式中出現的所有第二個給定字符串表達式
SET @InvestNums34 = REPLACE(@InvestNums34, '.00', '')
9. SCOPE_IDENTITY()
SELECT @ChaseTaskID = SCOPE_IDENTITY() --SCOPE_IDENTITY() 返回插入到同一作用域中的標識列內的最後一個標識值
10. 遊標是處理結果集的一種機制,能從包括多條數據記錄的結果集中每次提取一條記錄的機制
example:
DECLARE @Cur CURSOR --聲明遊標
DECLARE @ChaseTaskDetailID BIGINT
SET @Cur = cursor FAST_FORWARD for --定義遊標 --FAST_FORWARD指定啓用了性能優化的Forward_Only、Read_Only遊標
select [ID] from T_ChaseTaskDetails -- 遊標值爲每條數據的id
where SiteID = @SiteID
and ChaseTaskID = @ChaseTaskID
and GetDate() between dbo.F_GetIsuseStartTime(IsuseID)
and dbo.F_GetIsuseSystemEndTime(IsuseID, PlayTypeID)
order by [ID]
OPEN @Cur --打開遊標
FETCH NEXT FROM @Cur INTO @ChaseTaskDetailID --提取遊標數據
WHILE @@fetch_status = 0 --遊標讀取下一條數據是否成功
BEGIN
DECLARE @ReturnValue_2 INT
DECLARE @ReturnDescription_2 VARCHAR(100)
EXEC dbo.P_ExecChaseTaskDetail --執行dbo.P_ExecChaseTaskDetail存儲過程
@SiteID, @ChaseTaskDetailID, --輸入參數
@ReturnValue_2 OUTPUT, @ReturnDescription_2 OUTPUT --輸出結果
FETCH NEXT FROM @Cur INTO @ChaseTaskDetailID --讀取下一行數據
END --fetch into 移動遊標提取數據
CLOSE @Cur --關閉遊標
1. "FETCH 參數 FROM 遊標名 INTO 變量"爲提取遊標數據語法:
參數說明:
Frist:結果集的第一行;
Prior:當前位置的上一行;
Next:當前位置的下一行;
Last:最後一行;
Absoute n:從遊標的第一行開始數,第n行;
Relative n:從當前位置數,第n行.
2. 全局變量@@Fetch_Status可能出現3種值:0(Fetch語句成功); -1(Fetch語句失敗或行不在結果集中); -2(提取的行不存在)
通過檢測該值,獲得提取狀態信息,該狀態用於判斷Fetch語句返回數據的有效性。