==================================聲明==================================
本文原創,轉載在正文中顯要的注明作者和出處,並保證文章的完整性。
未經作者同意請勿修改(包括本聲明),保留法律追究的權利。
未經作者同意請勿用於出版、印刷或學術引用。
本文不定期修正完善,為保證內容正確,建議移步原文處閱讀。
本文鏈接:http://www.cnblogs.com/wlsandwho/p/4374367.html
=======================================================================
雖然早在上學時就學過Sql Server 2005,但是工作中一直沒有親手用過。
最近的工程拋棄了Access,用上了Sql Server 2008。
於是需要寫存儲過程了。
(不知道為什么他們那么喜歡Access,是部署方便,工業大多只存數據的原因?)
=======================================================================
看了幾天(虛詞)的資料,只能寫出這種程度,還是希望能有大神指點下。
=======================================================================
在數據庫中建立了一張表,用於存放上次未處理的數據。當軟件啟動的時候,讀取數據到界面,然后清空表。
之前我在VC++中用ADO分成2步做:在事務中,讀取表數據,刪除表數據。
沒有問題。但感覺好麻煩。
想看看能不能用存儲過程直接實現,於是看了下手冊:
OUT | OUTPUT 指示參數是輸出參數。使用 OUTPUT 參數將值返回給過程的調用方。除非是 CLR 過程,否則 text、ntext 和 image 參數不能用作 OUTPUT 參數。OUTPUT 參數可以為游標占位符,CLR 過程除外。
不能將表值數據類型指定為過程的 OUTPUT 參數。
看來只能曲線救國了。
=========================第一次寫這種東西,又要丟人了==============================
創建一個用戶定義表類型
1 CREATE TYPE TBLDATA AS TABLE 2 ( 3 [Cmd] [nvarchar](50), 4 [Num] [nvarchar](50), 5 [Name] [nvarchar](50) , 6 [InnerID] [nvarchar](50), 7 [Result] [nvarchar](50), 8 [EndTime] [datetime], 9 [Legal] [tinyint] 10 ) 11 12 GO
創建一個存儲過程
1 CREATE PROC usp_GetData 2 AS 3 BEGIN 4 SET NOCOUNT ON 5 6 DECLARE @tblSD TBLDATA 7 8 BEGIN TRANSACTION 9 INSERT INTO @tblSD 10 ( Cmd , 11 Num , 12 Name , 13 InnerID , 14 Result , 15 EndTime , 16 Legal 17 ) 18 SELECT Cmd , 19 Num , 20 Name , 21 InnerID , 22 Result , 23 EndTime , 24 Legal 25 FROM Data 26 27 DELETE FROM Data 28 COMMIT TRANSACTION 29 30 SET NOCOUNT OFF 31 32 SELECT Cmd , 33 Num , 34 Name , 35 InnerID , 36 Result , 37 EndTime , 38 Legal 39 FROM @tblSD 40 END
不要忘了授權
(我的testdev只有讀、寫權限)
1 GRANT EXECUTE ON usp_GetData TO testdev
=======================================================================
試了下,功能是實現了,感覺效率會坑,好在數據很少。
沒辦法,以后再說吧。
(已消毒,所以命名規范什么的,處女座請!自!重!)
=======================================================================
想來,我的這個存儲過程會返回好多結果,所以有必要先屏蔽行影響。
在命令行里試驗過,還要在代碼里能用才行。
