2015-02-24 18 views
0

我有大量数据想从C#Web应用程序发送到SQL Server数据库。目前我遍历循环中的数据并调用存储过程来添加数据。我返回插入(或现有)客户端记录的PK并将其添加到关联活动记录的外键,然后添加它们。我知道这不是非常有效,并且一直在研究使用表值参数。使用表值参数将PK返回到C#

我的数据集是类似以下内容:

Client (ID, FirstName, Surname, DOB ...) 
Activity1 (ID, ClientID(FK), Date ...) 
Activity2 (ID, ClientID(FK), Date ...) 

我想向所有客户端添加为批量插入和ID的使用OUTPUT子句在SQL Server返回,然后用这些ID来添加自己的相关活动作为PK-FK关系。我无法弄清楚的唯一情况是如何检查数据库中是否存在一个客户端(基于FirstName,Surname和DOB),如果是这样,则返回该ID而不是将客户端添加为新记录。

作为测试,我已经创建了接受TVP像这样的存储过程:

CREATE PROCEDURE [dbo].[TestBulkAdd] 
@Data AS dbo.Data READONLY 
AS 
BEGIN 
    DECLARE @IDS TABLE (ID INT, FirstName NVARCHAR(50), Surname NVARCHAR(50), DOB DATETIME2) 
    INSERT INTO Clients (FirstName, Surname, DOB) 
    OUTPUT inserted.* INTO @IDS 
    SELECT * FROM @Data 

    SELECT * FROM @IDS --Fills datatable in C# with returned data 
END 
GO 

任何帮助,将不胜感激。

回答

0

这个怎么样:

DECLARE @IDS TABLE (ID INT, FirstName NVARCHAR(50), Surname NVARCHAR(50), DOB DATETIME2); 

INSERT INTO @IDS (Id, FirstName, Surname, DOB) 
SELECT c.ID, c.FirstName, c.Surname, c.DOB 
FROM @Data d 
JOIN Clients c ON c.FirstName=d.FirstName AND c.SurName=d.SurName AND c.DOB=d.DOB 

INSERT INTO Clients (FirstName, Surname, DOB) 
OUTPUT inserted.* INTO @IDS 
SELECT d.FirstName, d.Surname, d.DOB 
FROM @Data d 
LEFT JOIN Clients c ON c.FirstName=d.FirstName AND c.SurName=d.SurName AND c.DOB=d.DOB 
WHERE c.ID IS NULL; 

SELECT * FROM @IDS --Fills datatable in C# with returned data 
+0

感谢的是,我不得不做出一个微小的变化。而不是SELECT * FROM @Data d我只能指定FirstName,Surname和DOB。 – bowfinger 2015-02-24 12:15:30

+0

你说得很对。我纠正了答案。 – 2015-02-24 12:26:28