基于带有修改数据的c#列表更新/插入/删除sql记录
假设列表中有5个元素被sql中的两个外键引用基于带有修改数据的c#列表更新/插入/删除sql记录,c#,sql,asp.net,C#,Sql,Asp.net,假设列表中有5个元素被sql中的两个外键引用 pk name country fk 1 james usa 12 2 smith canada 12 3 micheal usa 12 4 micheal usa 13 5 micheal usa 13 根据api的get请求,我将12作为外键id发送,并获得如下列表 1 james usa 12 2 smith canada 12 3 miche
pk name country fk
1 james usa 12
2 smith canada 12
3 micheal usa 12
4 micheal usa 13
5 micheal usa 13
根据api的get请求,我将12作为外键id发送,并获得如下列表
1 james usa 12
2 smith canada 12
3 micheal usa 12
当我删除元素2和3并使用新元素主键0更新列表时
1 james usa 12
0 sam africa 12
我在sql中的新数据应该是这样的
1 james usa 12
4 micheal usa 13
5 micheal usa 13
6 sam africa 12
我曾尝试在sql中使用merge语句在同一查询中执行insert update delete,但merge的问题是它也会删除id为13的其他元素
我的存储过程使用合并
ALTER PROCEDURE [dbo].[usp_insert_update_patientlifehistory]
@patientlifehistory as UT_PatientLifeHistory readonly
as
begin
merge tPATIENT_LIFEHISTORY
using @patientlifehistory as s
on (
tPATIENT_LIFEHISTORY.PAT_ID = s.PAT_ID or
tPATIENT_LIFEHISTORY.PATLI_ID = s.PATLI_ID
)
when matched then
UPDATE set
PAT_SUBJECT = s.PAT_SUBJECT
,PAT_HISTORY = s.PAT_HISTORY
when not matched by target then
INSERT
(PAT_SUBJECT, PAT_HISTORY, PAT_ID) VALUES
(s.pat_subject, s.pat_history, s.PAT_ID)
when not matched by source then
DELETE;
END
DDL
CREATE TABLE tPATIENT_LIFEHISTORY (
[PATLI_ID] [int] IDENTITY(1,1) NOT NULL,
[PAT_SUBJECT] [varchar](20) NULL,
[PAT_HISTORY] [varchar](30) NULL,
[PAT_ID] [int] NULL
FOREIGN KEY REFERENCES tPatient(PAT_ID),
[IS_ACTIVE] [bit] NULL DEFAULT ((1)), )
CREATE TYPE [dbo].[UT_PatientLifeHistory] AS TABLE(
[PATLI_ID] [int] NULL,
[PAT_SUBJECT] [varchar](200) NOT NULL,
[PAT_HISTORY] [varchar](200) NOT NULL,
[PAT_ID] [int] NOT NULL
)
我假设您正在尝试将数据从“src”表合并到下面的“tgt”表中:
-- src
pk name country fk
1 james usa 12
4 micheal usa 13
5 micheal usa 13
6 sam africa 12
-- tgt
pk name country fk
1 james usa 12
2 smith canada 12
3 micheal usa 12
4 micheal usa 13
5 micheal usa 13
通常,在执行MERGE
时,只需在ON
子句中指定PK
列,这样就不会有多个源行试图更新单个目标行
PATLI_ID
是否为t患者生命史
表的PK
?您能否将ON
子句更改为仅引用该字段,而不是使用或子句。比如:
merge t患者生命史
将@patientlifehistory用作
关于t患者生命史.PATLI\u ID=s.PATLI\u ID
更新
实际上,对于一个给定的患者,我认为你试图用一组当前的生活史数据更新他现有的生活史数据。如果是这种情况,并且假设PATLI_ID
值保留在“src”数据中,那么在ON
子句中将或更改为和可能是有意义的。这样,您就可以进行匹配,以查看给定患者是否存在生活史项目
您能为t患者生活史和UT患者生活史发布表DDL
?我假设您使用的是SQLServer
,对吗?是的,我使用的是sql tpatient_lifehistory的DDL是创建表tpatient_lifehistory([PATLI_ID][int]IDENTITY(1,1)notnull,[PAT_SUBJECT][varchar](20)NULL,[PAT PAT u HISTORY][varchar 30)NULL,[patu ID][int]NULL外键引用tpatient(PAT u ID),[IS_ACTIVE][bit]NULL默认值((1)),)
UT_PatientLifeHistor是表值参数CREATE TYPE[dbo]。[UT_PatientLifeHistory]作为表([PATLI_ID][int]NULL[patu SUBJECT][varchar](200)非空[PAT u HISTORY][varchar 200)非空[PAT ID][int]NOT NULL)
PATL_ID
是主键,PAT_ID
是外键,我需要根据外键和主键进行crud。如果您的(fk=13),我已经厌倦了和上的和
行被删除,然后听起来它们不在匹配时的或不匹配时的条件下。查看一行(pk=4)
关于您的ON
条件,该行匹配“目标”表中的两行(pk=4和pk=5)
。我不是100%确定,但可能这与您看到的有关。抱歉,我认为我无法提供更多帮助。它的外键不是主键fk=13
我只需要更新fk=13
值,而不是其他人的主键pk