Создание ручного цикла в процедуре SQL Server - всегда плохая идея - SQL Server работает с наборами данных - и ваш оператор также должен быть ориентирован на множество.
В вашем случае я бы сделал следующее:
- уничтожить XML во временную таблицу (как вы уже сделали)
- затем обновить существующие значения на основе условия объединения
- удалить эти строки, обновленные из временной таблицы
- остальные строки должны быть вставлены
То есть ваш код будет выглядеть примерно так:
CREATE PROCEDURE InsertIntoMyTable @mytable xml
AS BEGIN
SELECT
colx.value('(PointsliceId)[1]', 'INT') AS PointSliceId,
colx.value('(Pt_timestamp)[1]', 'DATETIME') AS Point_timestamp
colx.value('(FloatValue)[1]', 'FLAOT') AS Float_Value
INTO #TMP
FROM @mytable.nodes('DocumentElement/mytable') AS Tabx(Colx)
-- udpate the existing rows
UPDATE dbo.PointValue_Float
SET FloatValue = t.FloatValue
FROM #TMP t
WHERE t.PointSliceId = PointValue_Float.PointSliceId
AND t.Pt_timeStamp = PointValue_Float.Pt_timeStamp
-- remove those from the #TMP table
DELETE FROM #TMP
WHERE EXISTS
(SELECT * FROM dbo.PointValue_Float
WHERE PointSliceId = #TMP.PointSliceId AND Pt_timeStamp = #TMP.Pt_timeStamp)
-- INSERT the remaining rows
INSERT INTO
dbo.PointValue_Float(PointSliceId, Pt_timeStamp, FloatValue)
SELECT
PointSliceId, Pt_timeStamp, FloatValue
FROM #TMP
END