• 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

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

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

    没办法,以后再说吧。

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

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

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

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

  • 相关阅读:
    使用四元数点乘比较插值是否即将完成
    ShadowGun Demo学习(非技术向)
    测试-关于Unity获取子层级内容的几种接口(Transform FindChild, Component GetComponentInChildren,...)
    Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制
    Javascript事件模型系列(一)事件及事件的三种模型
    在代码中设置IE9的默认文档模式
    如何在博客园的文章/随笔中添加可运行的js代码
    jquery插件:仿百度首页可展开收起的消息提示控件
    有“镜头感”的网页是如何实现的
    HTML5 history API实践
  • 原文地址:https://www.cnblogs.com/wlsandwho/p/4374367.html
Copyright © 2020-2023  润新知