T-Sql Modify Insert SProc для обновления, если существует - PullRequest
3 голосов
/ 08 февраля 2010

Сценарий

У меня есть хранимая процедура, написанная на T-Sql, которую я использую для вставки данных в таблицу в виде XML. Поскольку данные регулярно обновляются, я хочу, чтобы строки обновлялись, если они уже существуют (кроме первого запуска приложения, они всегда будут существовать).

Вопрос

Ниже приведен код моего Insert Sproc, однако я не могу работать со стороной Обновления хранимой процедуры и буду признателен за некоторую помощь.

КОД

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[INS_Curve] 
(
 @Curve varchar(MAX)
)
AS
DECLARE @handle int
 exec sp_xml_preparedocument @handle OUTPUT, @Curve

 INSERT INTO CurveDB..tblCurve(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

1 Ответ

1 голос
/ 08 февраля 2010

Вместо того, чтобы вставлять непосредственно в таблицу назначения, поместите данные в документе 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" является уникальным / первичным ключом

UPDATE

Существует также функция UPSERT , представленная в Sql Server 2008, которая может представлять интерес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...