使用场景:sql
咱们和第三方水表厂家合做,他们会传递9万条json 经过咱们的接口 insert(update)咱们的数据库表中。数据库
表值参数:存储过程当中定义表的字段,类型(我理解为 临时表),C# 定义同样类型的DataTable,将json数据填充到DataTable,同时将DataTable 做为参数 传入到表值参数存储过程当中。json
Parallel.ForEach:自动对数据进行分区。假如9万条数据,4核 分为17462条数据分别做为table传入到存储过程执行insert(update)测试
这个我测试的时候,9万多条数据用时9分10秒,速度还有有点慢,我最后采用了另外一种办法,在下一篇博客中写道。blog
并行+表值参数主要代码 如下为C#主要代码接口
表值参数 建表:ip
USE [MeterReadTest]
GOci
/****** Object: UserDefinedTableType [dbo].[MRTableType] Script Date: 2018/6/20 15:58:48 ******/
CREATE TYPE [dbo].[MRTableType] AS TABLE(
[id] [int] NULL,
[freezedate] [varchar](20) NULL,
[dreaddate] [varchar](20) NULL,
[freezeMonth] [varchar](20) NULL,
[meter_sn] [varchar](20) NULL,
[meter_no] [varchar](20) NULL,
[flow] [decimal](18, 0) NULL,
[dayflow] [decimal](18, 0) NULL
)
GOget
存储过程:博客
USE [MeterReadTest]
GO
/****** Object: StoredProcedure [dbo].[sp_test] Script Date: 2018/6/20 15:57:22 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
/* 建立一个存储过程以表值参数做为输入 */
ALTER Procedure [dbo].[sp_test](@dataTable MRTableType readonly)
as
declare @temp Table(
id int,
freezedate varchar(20),
dreaddate varchar(20),
meter_sn varchar(20),
meter_no varchar(20),
flow decimal,
dayflow decimal,
freezeMonth varchar(20)
);
--将表值参数赋值给@temp
insert into @temp(id,freezedate,dreaddate,freezeMonth,meter_sn,meter_no,flow,dayflow) select id,freezedate,dreaddate,freezeMonth,meter_sn,meter_no,flow,dayflow from @dataTable;
declare
@oldflow AS varchar(20),
@id AS int,
@imeterid As int,
@freezedate As varchar(20),
@dreaddate As varchar(20),
@meter_sn varchar(20),
@meter_no varchar(20),
@flow decimal,
@sql nvarchar(1000),
@dayflow decimal,
@time date,
@readtime datetime,
@tempMeterID int,
@freezeMonth varchar(20);
--第一种方案 C# 并行+存储过程(循环遍历)
--while exists(select @id from @temp)
--begin
--SET ROWCOUNT 1
----赋值
--select @freezedate=freezedate,@dreaddate=dreaddate,@meter_sn=meter_sn,@id=id, @meter_no=meter_no,@flow=flow from @temp;
--select @time=(CONVERT(varchar(100),@freezedate, 20));
--select @readtime=(CONVERT(varchar(100),@dreaddate, 20));
-- select @oldflow=0;
----计算日用量
--select @tempMeterID= iMeterID from WR_Meters where tMeterAddr= @meter_no and iMeterManufactureID='1'
--select top 1 @oldflow=fFreezeNumber from WR_FreezeDay where iMeterID=@tempMeterID
--and dFreezeDate <@time order by dFreezeDate desc;
--if exists(select iMeterID from [dbo].[WR_FreezeDay] where iMeterID=@tempMeterID and dFreezeDate=@freezedate)
-- update WR_FreezeDay set fFreezeNumber=@flow,fUseNumber=(@flow-@oldflow),dFactDate=GETDATE(),
-- dReadDate=@readtime where iMeterID=(select iMeterID from WR_Meters where
-- tMeterAddr=@meter_no and iMeterManufactureID='1' and dFreezeDate=@time);
--else
-- insert into WR_FreezeDay (iMeterID,dFreezeDate,fFreezeNumber,fUseNumber,dFactDate,dReadDate) values
-- (@tempMeterID,@time,@flow,(@flow-@oldflow),getdate(),@readtime);
--SET ROWCOUNT 0 --DELETE FROM @temp WHERE id=@id; --end