我一直在试图弄清楚如何从C#控制台程序一次有效地插入100000行到sql server DB。
处理此问题的最佳方法是什么?
create table #input_table(empid [varchar] (10) not null,
empaddr [varchar](2000) NULL,[EMpName] [varchar](1000) NULL))
insert into empaddr_tobeverified('1','1 main st, salem,pa,USA','JOE STILTON');
insert into empaddr_tobeverified('2','200 Baker st, salem,pa,USA','JIMMY WU');
create table Addrstatus(
statusid [int] IDENTITY(1,1) not null primary key,
statusDesc [varchar](2000) not NULL);
insert into Addrstatus(1,'OK');
insert into Addrstatus(2,'Not OK');
create table empaddr_verified(
empid [varchar] (10) not null primary key,
empalladdr [varchar](2000) NULL,[EMpName] [varchar](1000) NULL,
statusid int not null Foreign Key references Addrstatus(statusid))
insert into empaddr_verified(
'1'
,'1 main st, salem,pa,USA | 100 WHITE Terr, Acton,MA USA'
,'JOE STILTON'
,(If not exists(
select statusid
from AddrStatus where statusDesc='NOT VERy SURE')
INSERT INTO Addrstatus('NOT VERy SURE'))))
create table employeeaddress(empid Foreign key references empaddr_verified(empid), empaddr varchar(1000) not null)l
insert into employeeaddresses('1','1 main st, salem,pa,USA ')
insert into employeeaddresses('1','100 WHITE Terr, Acton,MA USA ');
CREATE TYPE [testdb].[EMPTBL] AS TABLE(
[EMpName] [varchar](1000) NULL,
[EMpAllAddr] [varchar](1000) NULL,
[EMpID] [varchar](10) not NULL) , statusDesc varchar2(100) not null
create procedure usp_test
(@EMPObj As [testdb].[EMPTBL] Readonly)
insert into empaddr_verified as select * from @EMPObj
- 当状态ID在AddrStatus表中时有效 - 当AddIDStatus表中没有StatusID时,不确定如何处理如何使用表值参数
答案 0 :(得分:1)
由于瓶颈可能是您的API,而不是单个插页的速度,我不再担心批量插入。
相反,您只需创建类似
的存储过程CREATE PROCEDURE EmpAddressSetStatus
@empid INT,
@statusValue NVARCHAR(2000)
AS
-- see if there is an existing status
DECLARE @statusId INT
SELECT @statusId = statusId FROM AddrStatus WHERE statusDesc=@statusValue
-- if not then insert the new status
IF @statusId IS NULL
BEGIN
INSERT AddrStatus (statusDesc) VALUES (@statusValue)
SELECT @statusId = SCOPE_IDENTITY()
END
-- copy from the input table to the output table, setting the correct status
INSERT empaddr_verified(empId, empalladdr, statusid)
SELECT empId, empaddr, @statusId FROM inputtable WHERE empId = @empid
GO
确保它一次只做一次,但至少它很容易:)
当您使用一次性API时,很难获得任何大量节省。
答案 1 :(得分:0)
最好的方法是使用批量复制实用程序(如bcp或SSIS)来执行数据加载。如果你真的想为它编码,那么使用SqlBulkCopy类。这不会像第一种方法那样有效。