IT技術互動交流平台

好用的SQL TVP~~獨家贈送[增刪改查]的例子

作者__车商汇登陆:jackson0714  來源-_|小丑娃娃:IT165收集  發布日期-__毕打自己人suki:2016-12-16 20:35:43

 以前總是追求新東西|_-金坛阳光旅行社,發現基礎才是最重要的|_-花冈实太,今年主要的目標是精通SQL查詢和SQL性能優化_|恋上黑道千金的拽少爷。

 

一--qq2010官方下载正式版、什麼是TVP?

表值參數Table-Value Parameter (TVP) 提供一種將客戶端應用程序中的多行數據封送到 SQL Server 的簡單方式-|陆丰东海花园,而不需要多次往返或特殊服務器端邏輯來處理數據-|云帆彩票可靠吗。 您可以使用表值參數來包裝客戶端應用程序中的數據行--风行者观察站,並使用單個參數化命令將數據發送到服務器-|_盈彩网com。 傳入的數據行存儲在一個表變量中-_林嘉仪,然後您可以通過使用 Transact-SQL 對該表變量進行操作_|_雪菲官网。

可以使用標準的 Transact-SQL SELECT 語句來訪問表值參數中的列值-|365爱购网靠谱吗。  

簡單點說就是當想傳遞aaaa,bbbb,cccc,dddd給存儲過程時||_诺基亚6120c软件,可以先將aaa,bbb,ccc,dddd存到一張表中|||花儿演唱会:

aaaa
bbbb
cccc
dddd

然後將這張表傳遞給存儲過程__盈彩娱乐。

如|计提职工福利费:當我們需要查詢指定產品的信息時-_潜山陈斌凯,通常可以傳遞一串產品ID到存儲過程裏麵||长春新东方官网,如'1,2,3,4'-||周凯盈,然後查詢出ID=1或ID=2或ID=3或ID=4的產品信息--黄河视觉。

可以先將'1,2,3,4'存到一張表中-_|余庆教育网,然後將這張表傳給存儲過程_-|硫酸小檗碱。

1
2
3
4

 

 

 

 

 

 

那麼這種方法有什麼優勢呢_|_22彩票是什么网站?請接著往下看__|金谷证券。

二-_-206 217 214 175、早期版本是怎麼在 SQL Server 中傳遞多行的|105彩票怎么玩?

在 SQL Server 2008 中引入表值參數之前-__黑帮ceo的筹码情人,用於將多行數據傳遞到存儲過程或參數化 SQL 命令的選項受到限製|雳剑电视剧 全集36。 開發人員可以選擇使用以下選項--艾爵护理液,將多個行傳遞給服務器_|168彩票网会员:

使用一係列單個參數表示多個數據列和行中的值-_银泰店庆时间。 使用此方法傳遞的數據量受所允許的參數數量的限製_|银航娱乐。 SQL Server 過程最多可以有 2100 個參數-|雪碧兑奖。 必須使用服務器端邏輯才能將這些單個值組合到表變量或臨時表中以進行處理---6个男人要过河。

將多個數據值捆綁到分隔字符串或 XML 文檔中-_雪域藏王散,然後將這些文本值傳遞給過程或語句|_-平谷聊天室。 此過程要求相應的過程或語句包括驗證數據結構和取消捆綁值所需的邏輯--isk电容麦哪个好。

針對影響多個行的數據修改創建一係列的單個 SQL 語句__600643,例如通過調用 SqlDataAdapter 的 Update 方法創建的內容-陈诚传。 可將更改單獨提交給服務器-|-聚美优品网页打不开,也可以將其作為組進行批處理-||n78软件。 不過-__2号彩票平台,即使是以包含多個語句的批處理形式提交的-|洛阳三套,每個語句在服務器上還是會單獨執行_|苯乙烯密度。

使用 bcp 實用工具程序或 SqlBulkCopy 對象將很多行數據加載到表中_|小学语文教学随笔。 盡管這項技術非常有效_-亿发彩票安不安全,但不支持服務器端處理-||李天一受害老师照片,除非將數據加載到臨時表或表變量中|||新河镇中学贴吧。

三-|淘一站、例子

當我們需要查詢指定產品的信息時--助赢软件,通常可以傳遞一串產品ID到存儲過程裏麵||移动彩票网址,如'1,2,3,4'-优选彩票,然後查詢出ID=1或ID=2或ID=3或ID=4的產品信息|_良乡二中校园网。

我們可以先將“1,2,3,4”存到一張表中||_2019香港管家婆马报,然後作為參數傳給存儲過程-_中博彩票平台app。在存儲過程裏麵操作這個參數||基加美修的召唤石。

1.使用TVP 查詢產品

查詢產品ID=1,2,3,4,5的產品

public static void TestGetProductsByIDs()
{
    Collection<int> productIDs = new Collection<int>();
    Console.WriteLine();
    Console.WriteLine('----- Get Product ------');
    Console.WriteLine('Product IDs: 1,2,3,4,5');
    productIDs.Add(1);
    productIDs.Add(2);
    productIDs.Add(3);
    productIDs.Add(4);
    productIDs.Add(5);

    Collection<Product> dtProducts = GetProductsByIDs(productIDs);
    foreach (Product product in dtProducts)
    {
        Console.WriteLine('{0}   {1}', product.ID, product.Name);
    }
}

查詢的方法_|-众赢彩票挂机软件:

/// <summary>
/// Data access layer. Gets products by the collection of the specific product' ID.
/// </summary>
/// <param name='conn'></param>
/// <param name='productIDs'></param>
/// <returns></returns>
public static Collection<Product> GetProductsByIDs(SqlConnection conn, Collection<int> productIDs)
{
    Collection<Product> products = new Collection<Product>();
    DataTable dtProductIDs = new DataTable('Product');
    dtProductIDs.Columns.Add('ID', typeof(int));

    foreach (int id in productIDs)
    {
        dtProductIDs.Rows.Add(
            id
        );
    }

    SqlParameter tvpProduct = new SqlParameter('@ProductIDsTVP', dtProductIDs);
    tvpProduct.SqlDbType = SqlDbType.Structured;
    //SqlHelper.ExecuteNonQuery(conn, CommandType.StoredProcedure, 'procGetProducts', tvpProduct);

    using (SqlDataReader dataReader = SqlHelper.ExecuteReader(conn, CommandType.StoredProcedure, 'procGetProductsByProductIDsTVP', tvpProduct))
    {
        while (dataReader.Read())
        {
            Product product = new Product();
            product.ID = dataReader.IsDBNull(0) ? 0 : dataReader.GetInt32(0);
            product.Name = dataReader.IsDBNull(1) ? (string)null : dataReader.GetString(1).Trim();

            products.Add(product);
        }
    }
    return products;
} 

創建以產品ID作為列名的TVP|-_高唐贴吧:

IF NOT EXISTS(  SELECT * FROM sys.types WHERE name = 'ProductIDsTVP')
	CREATE TYPE [dbo].[ProductIDsTVP] AS TABLE
	(
		[ID] INT
	)
GO 

查詢產品的存儲過程---新奥杯:

/****** Object:  StoredProcedure [dbo].[procGetProductsByProductIDsTVP]******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[procGetProductsByProductIDsTVP]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
	DROP PROCEDURE [dbo].[procGetProductsByProductIDsTVP]
GO

Create PROCEDURE [dbo].[procGetProductsByProductIDsTVP]
(
	@ProductIDsTVP ProductIDsTVP READONLY
)
AS
            
SELECT p.ID, p.Name
	
FROM Product as p
INNER JOIN @ProductIDsTVP as t on p.ID = t.ID

2.使用TVP 刪除產品

 刪除產品ID=1,5,6的產品

public static void TestDeleteProductsByIDs()
{
    Collection<int> productIDs = new Collection<int>();
    Console.WriteLine();
    Console.WriteLine('----- Delete Products ------');
    Console.WriteLine('Product IDs: 1,5,6');
    productIDs.Add(1);
    productIDs.Add(5);
    productIDs.Add(6);
    DeleteProductsByIDs(productIDs);
}

 刪除的方法-_|魔兽大唐双龙传:

/// <summary>
/// Deletes products by the collection of the specific product' ID
/// </summary>
/// <param name='conn'></param>
/// <param name='productIDs'></param>
public static void DeleteProductsByIDs(SqlConnection conn, Collection<int> productIDs)
{
    Collection<Product> products = new Collection<Product>();
    DataTable dtProductIDs = new DataTable('Product');
    dtProductIDs.Columns.Add('ID', typeof(int));

    foreach (int id in productIDs)
    {
        dtProductIDs.Rows.Add(
            id
        );
    }

    SqlParameter tvpProduct = new SqlParameter('@ProductIDsTVP', dtProductIDs);
    tvpProduct.SqlDbType = SqlDbType.Structured;
    SqlHelper.ExecuteNonQuery(conn, CommandType.StoredProcedure, 'procDeleteProductsByProductIDsTVP', tvpProduct);
}

刪除產品的存儲過程--宝安教育在线基础教育:

/****** Object:  StoredProcedure [dbo].[procDeleteProductsByIDsByProductIDsTVP]******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[procDeleteProductsByProductIDsTVP]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
	DROP PROCEDURE [dbo].[procDeleteProductsByProductIDsTVP]
GO

Create PROCEDURE [dbo].[procDeleteProductsByProductIDsTVP]
(
	@ProductIDsTVP ProductIDsTVP READONLY
)
AS
            
DELETE p FROM Product AS p
INNER JOIN @ProductIDsTVP AS t on p.ID = t.ID

3.使用TVP 增加產品

增加產品

ID=5,Name=bbb

ID=6,Name=abc

public static void TestInsertProducts()
{
    Collection<Product> products = new Collection<Product>();
    Console.WriteLine();
    Console.WriteLine('----- Insert Products ------');
    Console.WriteLine('Product IDs: 5-bbb,6-abc');
    products.Add(
        new Product()
        {
            ID = 5,
            Name = 'qwe'
        });

    products.Add(
        new Product()
        {
            ID = 6,
            Name = 'xyz'
        });

    InsertProducts(products);
}

增加的方法_盈彩在线输钱能追回吗?:

/// <summary>
/// Inserts products by the collection of the specific products.
/// </summary>
/// <param name='conn'></param>
/// <param name='products'></param>
public static void InsertProducts(SqlConnection conn, Collection<Product> products)
{
    DataTable dtProducts = new DataTable('Product');
    dtProducts.Columns.Add('ID', typeof(int));
    dtProducts.Columns.Add('Name', typeof(string));

    foreach (Product product in products)
    {
        dtProducts.Rows.Add(
            product.ID,
            product.Name
        );
    }

    SqlParameter tvpProduct = new SqlParameter('@ProductTVP', dtProducts);
    tvpProduct.SqlDbType = SqlDbType.Structured;
    SqlHelper.ExecuteNonQuery(conn, CommandType.StoredProcedure, 'procInsertProductsByProductTVP', tvpProduct);
}

增加產品的存儲過程--传奇个性行会名字:

/****** Object:  StoredProcedure [dbo].[procInsertProductsByProductTVP]******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[procInsertProductsByProductTVP]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
	DROP PROCEDURE [dbo].[procInsertProductsByProductTVP]
GO

Create PROCEDURE [dbo].[procInsertProductsByProductTVP]
(
	@ProductTVP ProductTVP READONLY
)
AS
            
INSERT INTO Product (ID, Name)
SELECT
	t.ID, 
	t.Name
FROM @ProductTVP AS t

GO

4.使用TVP 更新產品

 將ID=2的產品的Name更新為bbb

   將ID=6的產品的Name更新為abc

public static void TestUpdateProducts()
{
    Collection<Product> products = new Collection<Product>();
    Console.WriteLine();
    Console.WriteLine('----- Update Products ------');
    Console.WriteLine('Product IDs: 2-bbb,6-abc');
    products.Add(
        new Product()
        {
            ID = 2,
            Name = 'bbb'
        });

    products.Add(
        new Product()
        {
            ID = 6,
            Name = 'aaa'
        });

    UpdateProducts(products);
}

 更新的方法__周星驰电影国语:

/// <summary>
/// Updates products by the collection of the specific products
/// </summary>
/// <param name='conn'></param>
/// <param name='products'></param>
public static void UpdateProducts(SqlConnection conn, Collection<Product> products)
{
    DataTable dtProducts = new DataTable('Product');
    dtProducts.Columns.Add('ID', typeof(int));
    dtProducts.Columns.Add('Name', typeof(string));

    foreach (Product product in products)
    {
        dtProducts.Rows.Add(
            product.ID,
            product.Name
        );
    }

    SqlParameter tvpProduct = new SqlParameter('@ProductTVP', dtProducts);
    tvpProduct.SqlDbType = SqlDbType.Structured;
    SqlHelper.ExecuteNonQuery(conn, CommandType.StoredProcedure, 'procUpdateProductsByProductTVP', tvpProduct);
}

創建以產品ID和產品Name作為列名的TVP||-王琳娜博客:

IF NOT EXISTS(  SELECT * FROM sys.types WHERE name = 'ProductTVP')

	CREATE TYPE [dbo].[ProductTVP] AS TABLE(
		[ID] [int] NULL,
		[Name] NVARCHAR(100)
	)

GO

增加產品的存儲過程-_鲨鱼vpn:

/****** Object:  StoredProcedure [dbo].[procUpdateProductsByIDs]******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[procUpdateProductsByProductTVP]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
	DROP PROCEDURE [dbo].[procUpdateProductsByProductTVP]
GO

Create PROCEDURE [dbo].[procUpdateProductsByProductTVP]
(
	@ProductTVP ProductTVP READONLY
)
AS
            
Update p
SET 
	p.ID = t.ID, 
	p.Name = t.Name
FROM product AS p
INNER JOIN @ProductTVP AS t on p.ID = t.ID

GO

結果_||阜南教育局:

注意_同心圆软件:

(1)無法在表值參數中返回數據-|_168彩票App。 表值參數是隻可輸入的參數--北京黄标车报废补贴;不支持 OUTPUT 關鍵字_-|盈盈彩中奖怎么领取。

(2)表值參數為強類型__-oppo805,其結構會自動進行驗證-100元彩金卡。 

(3)表值參數的大小僅受服務器內存的限製||纤之秀。

(4)刪除表值參數時_-早餐第一步价格,需要先刪除引用表值參數的存儲過程||西安小苏塘坝鱼。

四_|阿克苏诺贝尔待遇、寫在最後

後期會將TVP的性能問題和SQL Bulk Copy的用法補上|_湖南法检考试。

五-_河北职称信息管理系统、參考資料

表值參數 https://msdn.microsoft.com/zh-cn/library/bb675163.aspx

  • 表值參數(數據庫引擎)https://msdn.microsoft.com/zh-CN/Library/bb510489(SQL.100).aspx 

    推薦閱讀|-海华癫痫病医院:30分鍾全麵解析-SQL事務+隔離級別+阻塞+死鎖

    推薦閱讀|运盛彩票手机:T-SQL基礎博客目錄


    作  者_-_cf卡墙教程: Jackson0714
    出  處学生会办公室:http://www.cnblogs.com/jackson0714/

延伸閱讀_-_注册送体验金68的彩票:

Tag標簽-_银行家生活球馆: 好用   例子  
  • 專題推薦

  • Windows7係統入門 優化 技巧技術專題
  • Windows7係統專題 無論是升級操作係統--优彩网网址是什么、資料備份-_-菲利普斯曲线说明、加強資料的安全及管...... 詳細
About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯係方式
本站內容來自於互聯網,僅供用於網絡技術學習,學習中請遵循相關法律法規
盛源彩票运盛彩票秒速时时彩一品彩票运盛彩票分分彩

免责声明: 本站资料及图片来源互联网文章,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关,如用户分享不慎侵犯了您的权益,请联系我们告知,我们将做删除处理!