我有大量数据要从C#Web应用程序发送到SQL Server数据库。目前,我遍历循环中的数据并调用存储过程来添加数据。我返回插入(或现有)客户端记录的PK,并将其添加到关联活动记录的外键,然后添加它们。我知道这不是很有效,因此一直在调查表值参数的使用。
我的数据集类似于以下内容:
Client (ID, FirstName, Surname, DOB ...)
Activity1 (ID, ClientID(FK), Date ...)
Activity2 (ID, ClientID(FK), Date ...)
我想将所有客户端添加为批量插入,并使用SQL Server中的OUTPUT子句返回ID,然后使用这些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 :(得分: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