Tsql T-Sql修改插入存储过程以更新(如果存在) 脚本

Tsql T-Sql修改插入存储过程以更新(如果存在) 脚本,tsql,stored-procedures,Tsql,Stored Procedures,我有一个用T-Sql编写的存储过程,用于将数据作为XML插入表中。 因为数据会定期更新,所以如果行已经存在,我希望行被更新(除了应用程序第一次运行时,它们将始终存在) 问题: 下面是我的Insert存储过程的代码,但是我似乎无法解决存储过程的更新方面&希望能得到一些帮助 代码 不要直接插入到目标表中,而是将XML文档中的数据放入一个临时表中,然后从那里插入/更新目标 DECLARE @tabTemporary TABLE ( LoadID INT, BusinessDate DATETI

我有一个用T-Sql编写的存储过程,用于将数据作为XML插入表中。 因为数据会定期更新,所以如果行已经存在,我希望行被更新(除了应用程序第一次运行时,它们将始终存在)

问题: 下面是我的Insert存储过程的代码,但是我似乎无法解决存储过程的更新方面&希望能得到一些帮助

代码
不要直接插入到目标表中,而是将XML文档中的数据放入一个临时表中,然后从那里插入/更新目标

DECLARE @tabTemporary TABLE
(
  LoadID INT,
  BusinessDate DATETIME,
  Factor FLOAT
)

exec sp_xml_preparedocument @handle OUTPUT, @Curve

 INSERT INTO @tabTemporary (LoadID,BusinessDate, Factor)
  SELECT LoadID,BusinessDate, Factor
  FROM OPENXML(@handle, 'NewDataSet/Table1',2)
  WITH(
  LoadID int,
  BusinessDate DateTime,
  Factor float
  )

exec sp_xml_removedocument @handle

 INSERT INTO CurveDB..tblCurve
 ( LoadID, BusinessDate, Factor )
 SELECT LoadID, BusinessDate, Factor
 FROM @tabTemporary T1
 WHERE NOT EXISTS
 (
 SELECT 1 FROM CurveDB..tblCurve T2 WHERE T1.LoadID = T2.LoadID
 )

 UPDATE T1
 SET T1.BusinessDate = T2.BusinessDate, T1.Factor = T2.Factor
 FROM CurveDB..tblCurve T1
 INNER
 JOIN @tabTemporary T2
 ON T1.LoadID = T2.LoadID
注意:我假设“LoadID”是唯一的/主键

更新

Sql Server 2008中还引入了一些可能会引起兴趣的功能

DECLARE @tabTemporary TABLE
(
  LoadID INT,
  BusinessDate DATETIME,
  Factor FLOAT
)

exec sp_xml_preparedocument @handle OUTPUT, @Curve

 INSERT INTO @tabTemporary (LoadID,BusinessDate, Factor)
  SELECT LoadID,BusinessDate, Factor
  FROM OPENXML(@handle, 'NewDataSet/Table1',2)
  WITH(
  LoadID int,
  BusinessDate DateTime,
  Factor float
  )

exec sp_xml_removedocument @handle

 INSERT INTO CurveDB..tblCurve
 ( LoadID, BusinessDate, Factor )
 SELECT LoadID, BusinessDate, Factor
 FROM @tabTemporary T1
 WHERE NOT EXISTS
 (
 SELECT 1 FROM CurveDB..tblCurve T2 WHERE T1.LoadID = T2.LoadID
 )

 UPDATE T1
 SET T1.BusinessDate = T2.BusinessDate, T1.Factor = T2.Factor
 FROM CurveDB..tblCurve T1
 INNER
 JOIN @tabTemporary T2
 ON T1.LoadID = T2.LoadID