Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于带有修改数据的c#列表更新/插入/删除sql记录_C#_Sql_Asp.net - Fatal编程技术网

基于带有修改数据的c#列表更新/插入/删除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

假设列表中有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   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