/*

SQL SERVER 2008 表值参数

 

    SQL SERVER 引入了抗议用来将行集传入到存储过程和用户定义函数的表值参数.

这个功能可以使存储过程和函数具有封装多个行集的功能,而不是必须一行一行地调

数据修改过程和穿件多个输入参数来生硬的转化为多行.

 

    我们在应用中经常用到的插入时把代码封装到存储过程中。

*/
    CREATE DATABASE TESTDB
    
    USE TESTDB
    GO
    
    CREATE TABLE USERINFO(USERID INT,USERNAME NVARCHAR(50))
    GO
    
    CREATE PROC USP_INSERT_USERINFO
    @ID INT,
    @NAME NVARCHAR(50)
    AS
       INSERT USERINFO
       VALUES(@ID,@NAME)
       
    GO
/*

    上面的环境建立好后,如果我们需要向表中插入行数,就需要调用次这个

存储过程。在大多数情况下这样的情况是可以接受的,如果你经常需要一次插入多

条。那么就可以用中新增的表值参数类型,可以将要插入的数据传入到表值参

数中,然后通过表值参数一次性插入的表中。

   

    下面演示该参数类型。

*/

    --要使用表值参数,首先要定义用户定义表数据类型。

   

CREATE TYPE T_USERINFO AS TABLE
    (USERIDINT,
     USERNAME NVARCHAR(50)
     )
     GO
     
     --下面可以对上面的过程USP_INSERT_USERINFO进行修改。
     
     CREATE PROC USP_INSERT_USERINFO_NEW
     @USERINFO  T_USERINFO  READONLY --必须使用READONLY 选项声明表值参数
     AS
       INSERT USERINFO
       
       SELECT * FROM @USERINFO
    GO
    
    --一次插入多条数据
    
    DECLARE @USERINFO AS T_USERINFO
    
    
    INSERT @USERINFO VALUES(1001,'小张')
    INSERT @USERINFO VALUES(1002,'小王')
    INSERT @USERINFO VALUES(1003,'小李')
    INSERT @USERINFO VALUES(1004,'小明')
 
    EXEC USP_INSERT_USERINFO_NEW @USERINFO
    
    
    SELECT * FROM USERINFO
/*

    在处理业务时这个表值参数的新功能会很有用。譬如一个处理产品订单的网站,现在可以传入结果集

到一个存储过程中,而不是为每个产品每次调用存储过程。对于繁忙的系统,表值参数减少了应用程序和

数据库服务器之间的交互,从而减少了占用的带宽,数据库端的事务处理更高效。

*/