C 並行加錶值引數 處理9萬條資料

2022-09-11 10:12:14 字數 3409 閱讀 7741

使用場景:

我們和第三方水表廠家合作,他們會傳遞9萬條json 通過我們的介面 insert(update)我們的資料庫表中。

錶值引數:儲存過程中定義表的字段,型別(我理解為 臨時表),c#  定義一樣型別的datatable,將json資料填充到datatable,同時將datatable  作為引數 傳入到表值引數儲存過程中。

parallel.foreach:自動對資料進行分割槽。假如9萬條資料,4核   分為17462條資料分別作為table傳入到儲存過程執行insert(update)

並行+錶值引數主要**     以下為c#主要**

錶值引數  建表:

use [meterreadtest]

go/****** 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)go

儲存過程:

use [meterreadtest]

go/****** object: storedprocedure [dbo].[sp_test] script date: 2018/6/20 15:57:22 ******/

set ansi_nulls on

goset quoted_identifier on

go/* 建立乙個儲存過程以表值引數作為輸入 */

alter procedure [dbo].[sp_test](@datatable mrtabletype readonly)

asdeclare @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

--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

前端處理上萬條資料的優化

最近碰到一面試題給了乙個請求介面,沒有分頁,一共一萬條資料,並且讓前端渲染在頁面上,這個場景一般在實際應用場景不多見,一般後端都會設定分頁查詢,但是面試官考的就是前端對於大量資料的處理能力。看本文之前不妨思考下,如果讓你做,你會怎麼處理呢?先給出 吧!列表資料搜尋 var search method...

C 使用EPPlus 秒匯出10萬條資料

1.先要引用dll檔案,可以直接使用vs自帶的包管理,如下圖 輸入 epplus 我這裡是安裝過了的所以這裡顯示的是解除安裝而不是安裝。安裝成功了之後會看到這個dll檔案 如下 匯出excel protected void btnmemexcel click object sender,eventa...

SQL 快速向表中插入100萬條資料

setnocounton 02use master 03go 04 判斷資料庫testdb是否存在,即建立資料庫 05if db id testdb isnull 06createdatabasetestdb 07go 08use testdb 09go 10 判斷nums 表是否存在,存在即將其刪...