Возврат PK в C# с использованием табличных параметров
У меня есть большой объем данных, которые я хотел бы отправить из веб-приложения C# в базу данных SQL Server. В настоящее время я перебираю данные в циклах и вызываю хранимые процедуры для добавления данных. Я возвращаю PK вставленной (или существующей) клиентской записи и добавляю ее к внешнему ключу связанных записей операций, а затем добавляю их. Мне известно, что это не очень эффективно, и с тех пор я изучал использование табличных параметров.
Мой набор данных похож на следующее:
Client (ID, FirstName, Surname, DOB ...)
Activity1 (ID, ClientID(FK), Date ...)
Activity2 (ID, ClientID(FK), Date ...)
Я хотел бы добавить всех клиентов в качестве массовой вставки и вернуть идентификаторы с помощью предложения OUTPUT в SQL Server, а затем добавить связанные с ними действия с этими идентификаторами в качестве отношения PK-FK. Единственное, что я не могу понять, это как проверить, существует ли клиент в базе данных (на основании того, что FirstName, Surname и DOB совпадают) и, если это так, вернуть этот идентификатор вместо добавления клиента в качестве новой записи.
В качестве теста я создал хранимую процедуру, которая принимает 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 ответ
Как насчет этого:
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