У меня есть две таблицы, подобные этой:
Table1
DataS DataH DataO
001 101 ABA
003 101 ABC
001 101 AAB
001 105 BBA
002 102 ABB
002 102 ACA
Table2
DataS DataH DataO Result1 Result2 Result3
003 101 ABC
001 105 BBA
Я пытаюсь сделать процедуру с двумя входными параметрами: @DataS
, @DataH
. Какую процедуру следует сделать:
- Выбрать все записи из таблицы1
WHERE DataS=@DataS AND DataH=@DataH
.
- Для каждой выбранной строки проверьте, существует ли запись IF в таблице 2 с теми же тремя значениями
[DataS]
[DataH]
[DataO]
.
- ЕСЛИ да - ОБНОВИТЬ эту строку в таблице 2 (SET Result1 = (MyFunction), SET Result2 = (MyFunction) и т. Д.)
- IF no - ВСТАВИТЬ эту строку со всеми параметрами [DataS] [DataH] [DataO] [Result1] [Result2] [Result3]
Поэтому после выполнения процедуры таблица 2 должна выглядеть следующим образом:
Таблица2 (после обновления)
DataS DataH DataO Result1 Result2 Result3
003 101 ABC 1.5 1.3 1.4
001 105 BBA 1.6 1.1 1.3
001 101 ABA 1.6 1.3 1.4
001 101 AAB 1.6 1.3 1.4
002 102 ABB 1.1 1.4 1.4
002 102 ACA 1.3 1.4 1.1
Возможно ли сделать это за одну процедуру? Каков наилучший способ (сохранить также хорошую эффективность)? Можно ли сделать это с помощью cte или есть лучшее решение, какая-нибудь функция цикла?
DECLARE @ID int
SELECT @ID = (SELECT ID FROM Table2 WHERE DataS=@DataS AND DataH=@DataH AND DataO=@DataO)
IF EXISTS @ID
BEGIN
--UPDATE Table2 SET Result1=... WHERE ID=@ID
END
ELSE
BEGIN
--INSERT INTO Table2 (.....)
END
UPDATE:
Я думаю, что лучшее решение - использовать MERGE, как сказал Луис Казарес (спасибо), поэтому я сделал новую процедуру, такую как:
MERGE Table2 AS ex
USING x AS st
ON (x.DataS = st.DataSAND ex.DataO = st.DataO AND ex.DataH = st.DataH)
WHEN MATCHED THEN UPDATE SET ex.Result1 = 9
WHEN NOT MATCHED THEN
INSERT(DataS,DataH,DataO,Result1)
VALUES(st.DataS,st.DataH,st.DataO,9);
Выглядит так умно, но это не работает, и я заметил, что MERGE не поддерживается на старом SQL Server 2005, который я использую (начиная с 2008 года). Поэтому я пытаюсь использовать функцию CURSOR, как предложил mkRabbani, и она работает (спасибо).