天天看點

表值變量 在批量操作中的用法

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

以更新地區的排序值為例子:

建立表值變量的方法:

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      

可以看到,建立表值變量類型,聲明變量來引用它,然後給變量填充資料,然後将值傳遞給存儲過程.