Регулярно обновляйте таблицы в одной базе данных из нескольких таблиц в другой базе данных. - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть 2 базы данных в SQL Server, DB1 имеет несколько таблиц, и некоторые таблицы постоянно обновляются новыми записями.В DB2 есть только 1 таблица, которая должна содержать всю объединенную информацию из нескольких таблиц в DB1 и должна обновляться каждые 2 часа.

Например, в DB1 есть 3 таблицы: "ProductInfo", "StationRecord","StationInfo".У первых двух таблиц есть столбец отметки времени, который указывает, когда создается запись (т.е. две таблицы обновляются асинхронно, ТОЛЬКО когда продукт проходит все станции в «StationRecord», будет ли «ProductInfo» обновляться новым продуктом), ипоследняя таблица является фиксированной.

Таблицы следующие:

USE DB1
GO

CREATE TABLE ProductInfo 
ProductID bigint Primary Key NOT NULL
TimeCreated datetime    
ProductName nvarchar(255)

CREATE TABLE StationRecord 
RecordID bigint Primary Key NOT NULL
TimeCreated datetime      
ProductID bigint NOT NULL
StationID bigint

CREATE TABLE StationInfo
StationID bigint Primary Key NOT NULL
BOM_used nvarchar(255)

В DB2 есть только 1 таблица, содержащая составной PK "ProductID" и "StationID", как показано ниже:


CREATE TABLE DB2.BOMHistory AS
SELECT 
    DB1.ProductInfo.ProductID
    DB1.ProductInfo.TimeCreated AS ProductCreated
    DB1.StationInfo.StationID
    DB1.StationInfo.BOM_used
    FROM DB1.ProductInfo
JOIN DB1.StationRecord
ON DB1.ProductInfo.ProductID = DB1.StationRecord.ProductID
JOIN DB1.StationInfo
ON DB1.StationRecord.StationID = DB1.StationInfo.StationID 
constraint PK_BOMHistory Primary Key (ProductID,StationID)

Я вычислил временную часть, которая должна использовать создание задания с некоторыми заранее установленными расписаниями, и задание заключается в выполнении хранимой процедуры.Проблема заключается в том, как правильно написать хранимую процедуру, которая должна выполнять следующие действия:

  1. ждать, пока последний продукт пройдет все станции (и таблица «stationInfo» обновится полностью)
  2. найти все НОВЫЕ записи, сгенерированные в этом цикле, в таблицах в DB1
  3. объединить информацию из 3 таблиц в DB1
  4. вставить объединенную информацию в DB2.BOMHistory

Вот мой код:

ALTER Procedure BOMHistory_Proc
BEGIN
    SELECT
        DB1.ProductInfo.ProductID,
        DB1.ProductInfo.TimeCreated AS ProductCreated
        DB1.StationInfo.StationID,
                DB1.StationInfo.BOM_used
    into #temp_BOMList
    FROM DB1.ProductInfo
        JOIN DB1.StationRecord
        ON DB1.ProductInfo.ProductID = DB1.StationRecord.ProductID
        JOIN DB1.StationInfo
        ON DB1.StationRecord.StationID = DB1.StationInfo.StationID 
    ORDER BY ProductInfo.ProductID
END

SELECT * from #temp_BOMList

INSERT INTO DB2.BOMHistory(ProductID, ProductCreated, StationID, BOM_used)
SELECT  DISTINCT (ProductID, stationID)
FROM #temp_BOMList
WHERE (ProductID, stationID) NOT IN (SELECT ProductID, stationID FROM DB2.BOMHistory)

Условие в операторе INSERT не работает, пожалуйста, дайте несколько советов.

Кроме того, я должен использовать переменную таблицы или временную таблицу для этого приложения?

1 Ответ

0 голосов
/ 25 апреля 2019

Попробуйте:

INSERT INTO DB2.BOMHistory(ProductID, ProductCreated, StationID, BOM_used)
SELECT DISTINCT tb.ProductID, tb.ProductCreated, tb.StationID, tb.BOM_used
FROM #temp_BOMList tb
WHERE NOT EXISTS
(SELECT * FROM DB2.BOMHistory WHERE ProductID = tb.ProductID AND StationID = tb.StationID)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...