表值参数参考其他表

时间:2014-04-17 10:38:51

标签: c# sql-server

我一直在试图弄清楚如何从C#控制台程序一次有效地插入100000行到sql server DB。

  1. 从输入表
  2. 中选择100000
  3. 将每条记录发送到API。
  4. 结果收集在列表对象
  5. 调用一个带有表值参数的过程。
  6. 我无法直接说出从@EMPObj参数插入empaddr_verified select *,因为verified_table正在引用其他表。
  7. 处理此问题的最佳方法是什么?

     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时,不确定如何处理如何使用表值参数

2 个答案:

答案 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类。这不会像第一种方法那样有效。

StackOverFlow: Bulk insert records into SQL Server database