项目中以前批量插入和更新,因为没有用到EF,所以一直用C#开启事务,拼接sql语句来提交。
最近发现用表变量提交会很简单。
简单列出插入和更新语句:
GO
一:表类型
创建表类型:
CREATE TYPE dbo.stock_details AS TABLE ( id INT, goods_id INT, number INT )
定义并使用表类型: DECLARE @stock_details dbo.stock_details --表类型中插入数据 INSERT INTO @stock_details ( id, goods_id, number ) VALUES ( 1, -- id - int 1, -- goods_id - int 33 -- number - int ) INSERT INTO @stock_details ( id, goods_id, number ) VALUES ( 11, -- id - int 11, -- goods_id - int 133 -- number - int )
二:临时表 --创建局部临时表 CREATE TABLE #tempTable(id int NOT NULL,NAME INT NOT NULL ,number int NOT NULL) --从表变量数据插入到临时表中 INSERT into #tempTable SELECT id,goods_id,number FROM @stock_details --批量将表变量数据插入数据库中,注意:字段的个数要求一样多 INSERT dbo.tb_stock SELECT id ,goods_id,number,1 FROM @stock_details --批量将表变量中的数据更新到数据库中 UPDATE dbo.tb_stock SET quantity=[@stock_details].number FROM dbo.tb_stock ,@stock_details WHERE dbo.tb_stock.warehouse_id=[@stock_details].id
前缀“##”为全局临时表,创建全局临时表
CREATE TABLE ##tempTable(id int NOT NULL,NAME INT NOT NULL ,number int NOT NULL)
三.表变量
单独定义一个表变量
DECLARE @tab TABLE(id INT,NAME NVARCHAR(50))
对比优点:
1.表类型,前期已经定义好,后面直接可以定义用就行。
2.表变量和临时表,都会在物理内存存储,数据量比较小几条用表变量,比较大用临时表。
3.表变量只在执行语句块有用。