博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
表值变量 在批量操作中的用法
阅读量:7071 次
发布时间:2019-06-28

本文共 5037 字,大约阅读时间需要 16 分钟。

表值变量在批量操作中的用法:

以更新地区的排序值为例子:

创建表值变量的方法:

View Code
1 CREATE TYPE Ty_UpdateAreaInfoShowOrder as Table 2 ( 3 [ID] int primary key not null, 4 [ShowOrder] int null 5 )

在存储过程中做批量操作的例子:

View Code
CREATE PROC USP_UpdateAreaInfoShowOrder @dt Ty_UpdateAreaInfoShowOrder readonly AS BEGIN DECLARE @ERRORSUM SMALLINT =0 BEGIN TRAN SET @ERRORSUM=-1; UPDATE  m SET M.ShowOrder = d.ShowOrder  FROM MD_AreaInfo m ,@dt d where m.ID = d.ID IF(@@ERROR<>0) GOTO ERROR_HANDLE; COMMIT TRAN; RETURN 0     ERROR_HANDLE: ROLLBACK TRAN; RETURN @ERRORSUM; END

可以看到存储过程的传入参数的表值变量类型(上面所定义的表值变量)

调用存储过程的方法:

View Code
1  public void BindGrid()  2         {
3 using (SqlConnection conn = new SqlConnection(ConnectionString)) 4 {
5 using (SqlCommand cmd = conn.CreateCommand()) 6 {
7 cmd.CommandText = "SELECT [ID], [CnName],[EnName],[ShowOrder] FROM MD_AreaInfo where Parentid=0 ORDER BY SHOWORDER "; 8 DataSet ds = new DataSet(); 9 SqlDataAdapter da = new SqlDataAdapter(cmd); 10 da.Fill(ds); 11 this.gv.DataSource = ds.Tables[0]; 12 this.gv.DataBind(); 13 } 14 } 15 } 16 public DataTable CreateTable() 17 {
18 DataTable dt = new DataTable(); 19 dt.Columns.Add("ID", typeof(int)); 20 dt.Columns.Add("ShowOrder", typeof(int)); 21 return dt; 22 } 23 protected void btn_Click(object sender, EventArgs e) 24 {
25 DataTable dt = CreateTable(); 26 for (int i = 0; i < gv.Rows.Count; i++) 27 {
28 HiddenField hd = (HiddenField)gv.Rows[i].FindControl("hdID"); 29 TextBox tb = (TextBox)gv.Rows[i].FindControl("txtShowOrder"); 30 DataRow dr = dt.NewRow(); 31 dr[0] = int.Parse(hd.Value); 32 dr[1] = int.Parse(tb.Text.Trim()); 33 dt.Rows.Add(dr); 34 } 35 RunStore("USP_UpdateAreaInfoShowOrder", dt); 36 BindGrid(); 37 } 38 public int RunStore(string storeName, DataTable dt) 39 {
40 using (SqlConnection conn = new SqlConnection(ConnectionString)) 41 {
42 conn.Open(); 43 using (SqlCommand cmd = conn.CreateCommand()) 44 {
45 cmd.CommandText = storeName; 46 cmd.CommandType = CommandType.StoredProcedure; 47 SqlParameter sp = new SqlParameter("@dt", SqlDbType.Structured); 48 sp.TypeName = "Ty_UpdateAreaInfoShowOrder"; 49 sp.Value = dt; 50 cmd.Parameters.Add(sp); 51 return cmd.ExecuteNonQuery(); 52 } 53 } 54 return 0; 55 }

表值参数是 SQL Server 2008 中的新参数类型。表值参数是使用用户定义的表类型来声明的。使用表值参数,可以不必创建临时表或许多参数,即可向 Transact-SQL 语句或例程(如存储过程或函数)发送多行数据;

表值参数具有更高的灵活性,在某些情况下,可比临时表或其他传递参数列表的方法提供更好的性能。表值参数具有以下优势:

  • 首次从客户端填充数据时,不获取锁。
  • 提供简单的编程模型。
  • 允许在单个例程中包括复杂的业务逻辑。
  • 减少到服务器的往返。
  • 可以具有不同基数的表结构。
  • 是强类型。
  • 使客户端可以指定排序顺序和唯一键。

限制

  • 表值参数有下面的限制:

    • SQL Server 不维护表值参数列的统计信息。
    • 表值参数必须作为输入 READONLY 参数传递到 Transact-SQL 例程。不能在例程体中对表值参数执行诸如 UPDATE、DELETE 或 INSERT 这样的 DML 操作。
    • 不能将表值参数用作 SELECT INTO 或 INSERT EXEC 语句的目标。表值参数可以在 SELECT INTO 的 FROM 子句中,也可以在 INSERT EXEC 字符串或存储过程中。

注SqlParameter的SqlDbType定义为SqlDbType.Structured;

TypeName为你所定义表值类型名

value 为 构建的新的内存中的表 

举个例子,创建表值变量

View Code
1 ---------------------------------------------------------  2  ----创建表值变量Ty_ProductionLocation--------------------  3  ---------------------------------------------------------  4  CREATE TYPE Ty_ProductionLocation AS TABLE(  5  Name NVARCHAR(50) NOT NULL,  6  CostRate smallmoney NOT NULL,  7  Availability DECIMAL(18,4) NOT NULL  8  )  9  --------------------------------------------------------- 10  ----创建存储过程usp_AddProductLocation------------------- 11  --------------------------------------------------------- 12  CREATE PROC usp_AddProductLocation 13  @dt Ty_ProductionLocation READONLY 14  AS 15     BEGIN 16         SET NOCOUNT ON; 17         DECLARE @ERRORSUM SMALLINT; 18         BEGIN TRAN; 19             SET @ERRORSUM =-1; 20             INSERT INTO Production.Location(Name,CostRate,Availability,ModifiedDate) 21             SELECT tt.*,GETDATE() FROM @dt tt; 22             IF(@@ERROR<>0) GOTO ERROR_HANDLE; 23         COMMIT TRAN; 24         RETURN 0; 25 ERROR_HANDLE: 26         ROLLBACK TRAN; 27         RETURN @ERRORSUM; 28     END 29 ---------------------------------------------------------- 30 --------调用usp_AddProductLocation存储过程---------------- 31 ---------------------------------------------------------- 32 DECLARE @dtt Ty_ProductionLocation; 33 INSERT INTO @dtt(Name,CostRate,Availability)  SELECT Name,0,0 FROM  Person.StateProvince; 34 EXEC usp_AddProductLocation @dtt

可以看到,创建表值变量类型,声明变量来引用它,然后给变量填充数据,然后将值传递给存储过程.

 

转载地址:http://avzml.baihongyu.com/

你可能感兴趣的文章
快速排序(QuickSort)
查看>>
Java8之使用Optional进行Null处理
查看>>
jsckson,想说爱你不容易啊。。。406错误
查看>>
WindowsForm 公共控件 菜单和工具栏
查看>>
真正的竞争力,是把所有人都可能拥有的东西变成财富,让沙子变成硅,这才是核心。大家都把大数据当作金矿,想要掘金。但在我看来,大数据的厉害之处是把沙子变成了硅。...
查看>>
C#中static关键字的作用(转)
查看>>
Codeforces Round #428 (Div. 2) B
查看>>
iOS开发——OC篇&纯代码退出键盘
查看>>
SQL Server 2008R2各个版本,如何查看是否激活,剩余可用日期?
查看>>
使用批处理实现完整备份Outlook 2010和恢复
查看>>
RSA加密(C语言)
查看>>
loadrunner常用函数整理
查看>>
办公技巧:局域网内设置固定ip
查看>>
响应式区间
查看>>
jq各个版本
查看>>
nc ltx转发
查看>>
团队作业(三)
查看>>
字符串的拷贝、二叉树的拷贝
查看>>
使用github管理iOS分布式项目开发
查看>>
【Supervised Learning】支持向量机SVM (to explain Support Vector Machines (SVM) like I am a 5 year old )...
查看>>