==================================声明==================================
本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。
未经作者同意请勿修改(包括本声明),保留法律追究的权利。
未经作者同意请勿用于出版、印刷或学术引用。
本文不定期修正完善,为保证内容正确,建议移步原文处阅读。
本文链接: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
=======================================================================
试了下,功能是实现了,感觉效率会坑,好在数据很少。
没办法,以后再说吧。
(已消毒,所以命名规范什么的,处女座请!自!重!)
=======================================================================
想来,我的这个存储过程会返回好多结果,所以有必要先屏蔽行影响。
在命令行里试验过,还要在代码里能用才行。