Мне нужна помощь в этой хранимой процедуре SQL. Я собираю промежуточную таблицу (COM_EXISTENCIAS) с источниками из разных таблиц для целей отчетности. На первом этапе я заполнить его с данными в COM_INVENTARIOS таблице, которые соответствуют определенным реквизитам, сгруппированные подвести запасы, если есть больше, чем линии, совпадающих с cryteria:SQL: обновление, если существует с хранимой процедурой
BEGIN
INSERT INTO COM_EXISTENCIAS
(
Mes ,
Anyo ,
Centro ,
Codigo ,
Stock ,
Descripcion
)
SELECT I.Mes ,
I.Anyo ,
I.Centro ,
I.Codigo ,
SUM(I.Stock) AS STOCK ,
I.Descripcion
FROM COM_INVENTARIOS I
WHERE I.Mes = @Mes
AND I.Centro = @Emp
AND I.NumInv = @NumInv
AND I.Anyo = @Anyo
GROUP BY I.Codigo ,
I.Mes ,
I.Anyo ,
I.Centro ,
I.Descripcion
END
На втором этапе, я продолжаю заполнение таблицы с использованием данных из другой таблицы (только продукты, которые не были вставлены в первый запрос, или не существуют уже в таблице)
INSERT INTO COM_EXISTENCIAS
(
Mes ,
Anyo ,
Centro ,
Stock ,
Codigo
)
SELECT @Mes ,
@Anyo ,
@Emp ,
0 ,
Cod_art
FROM COM_ENTRADAS
WHERE MONTH(Fecha) = @Mes
AND Emp = @Emp
AND YEAR(Fecha) = @Anyo
EXCEPT
SELECT @Mes ,
@Anyo ,
@Emp ,
0 ,
Codigo
FROM COM_INVENTARIOS
WHERE Mes = @Mes
AND Centro = @Emp
AND Anyo = @Anyo
EXCEPT
SELECT @Mes ,
@Anyo ,
@Emp ,
0 ,
Codigo
FROM COM_EXISTENCIAS
WHERE Mes = @Mes
AND Centro = @Emp
AND Anyo = @Anyo
Это было прекрасно работает до тех пор, как я только должен был бежать это один раз. Иногда мне нужно перезапустить хранимую процедуру, потому что некоторые новые продукты были добавлены в COM_INVENTARIOS. Я обнаружил, что если строка уже была вставлена из COM_ENTRADAS на втором шаге и теперь существует в COM_INVENTARIOS, вместо обновления текущей строки она вставляет новую строку, поэтому я заканчиваю двумя строками с теми же данными. Как изменить первую часть запроса для обновления вместо добавления, если Mes, Centro, NumInv и Anyo уже существуют в таблице?
И дополнительный вопрос: после создания строк я затем делаю дополнительный запрос, чтобы обновить их с помощью данных в COM_ENTRADAS на третьем шаге. Он работает сейчас, но, может быть, есть еще один «чистый» способ запроса БД или объединение двух запросов в одном?
UPDATE dbo.COM_EXISTENCIAS
SET TotEntradas = T.TotEnt ,
ImporteCompras = T.Importe
FROM (SELECT Cod_art ,
ISNULL(ROUND(SUM(Cantidad), 3), 0) AS TotEnt ,
ISNULL(ROUND(SUM((P_coste) * (Cantidad)), 2), 0) AS Importe
FROM COM_ENTRADAS
WHERE Emp = @Emp
AND MONTH(Fecha) = CAST(@Mes AS INT)
AND YEAR(Fecha) = CAST(@Anyo AS INT)
GROUP BY Cod_art
) AS T
WHERE T.Cod_art = dbo.COM_EXISTENCIAS.Codigo
AND Mes = @Mes
AND Anyo = @Anyo
AND Centro = @Emp
Вы можете '' UPDATE' или INSERT' в соответствии с условиями с 'п MERGE': msdn.microsoft.com/en-us /library/bb510625.aspx – NickyvV
Забыл сказать, что это SQL 2005, поэтому я не могу использовать MERGE, к сожалению. – user3328998