SQL Server 2008 R2——T-SQL 存储过程 返回表

==================================声明==================================

本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性。

未经作者同意请勿修改(包括本声明),保留法律追究的权利。

未经作者同意请勿用于出版、印刷或学术引用。

本文不定期修正完善,为保证内容正确,建议移步原文处阅读。

本文链接:http://www.cnblogs.com/wlsandwho/p/4374367.html

=======================================================================

虽然早在上学时就学过Sql Server 2005,但是工作中一直没有亲手用过。

最近的工程抛弃了Access,用上了Sql Server 2008。

于是需要写存储过程了。

 (不知道为什么他们那么喜欢Access,是部署方便,工业大多只存数据的原因?)

=======================================================================

看了几天(虚词)的资料,只能写出这种程度,还是希望能有大神指点下。

=======================================================================

在数据库中建立了一张表,用于存放上次未处理的数据。当软件启动的时候,读取数据到界面,然后清空表。

之前我在VC++中用ADO分成2步做:在事务中,读取表数据,删除表数据。

没有问题。但感觉好麻烦。

想看看能不能用存储过程直接实现,于是看了下手册:

OUT | OUTPUT
指示参数是输出参数。使用 OUTPUT 参数将值返回给过程的调用方。除非是 CLR 过程,否则 textntextimage 参数不能用作 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

=======================================================================

试了下,功能是实现了,感觉效率会坑,好在数据很少。

没办法,以后再说吧。

 (已消毒,所以命名规范什么的,处女座请!自!重!)

=======================================================================

想来,我的这个存储过程会返回好多结果,所以有必要先屏蔽行影响。

在命令行里试验过,还要在代码里能用才行。

原文地址:https://www.cnblogs.com/wlsandwho/p/4374367.html