使用表值参数将PK返回到C#

时间:2015-02-24 10:39:26

标签: c# sql-server table-valued-parameters

我有大量数据要从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

非常感谢任何帮助。

1 个答案:

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