MSSQL - cykliczne kopiowanie danych po między tabelami

0

Witam serdecznie,
Zwracam się z uprzejmą prośbą o pomoc w poniższej kwestii. Otóż potrzebuję skopiować dane z jednej tabeli do drugiej (w obrębie różnych bazach). Kolumny w tabelach mają inny rozkład i nazwy.
Główny problem przy kopiowaniu jest taki, że Tabela pierwsza ma klucz tabeli założony na innych polach. Chodzi o to że TABELA1.ŻRÓDŁO ma kilka kolumn:
ID – unikalny generowany automatycznie
Ulica, Miasto, kod pocztowy itp
NAZWA_PROJEKTU – pczyczyna problemów
data projektu

TABELA2.CEL ma również takie pola, tylko mniejszą liczbę i w innym rozkładzie. Problemem jest kolumna NAZWA_PROJEKTU, który w tej tabeli docelowej (w tabeli docelowej nazywa się BAZACEL.dbo.TABELACEL.ProID) jest ustawiony jako klucz, który musi być unikalny

Problem polega na tym, że nie jestem w stanie wprost skopiować danych gdyż w TABELA1.ŹRÓDŁO nazwy projektów często nie były uzupełniane, albo były. Nie jest to dramat, jestem w stanie żyć bez tych danych w nowej tabeli.
Próbowałem stworzyć zapytanie które niestety nie do końca chce kopiować dane bez zduplikowanych wartości…

BAZAŹRÓDŁO.dbo.TABELAŹRÓDŁO .NAZWA_PROJEKTU --> BAZACEL.dbo.TABELACEL.ProID

INSERT INTO         BAZACEL.dbo.TABELACEL (PName, PKStreet,  PKZip,  PKCity,  ProID, ProDta)
SELECT              ProName, ProKStreet, ProKZip, ProKCity, NAZWA_PROJEKTU,DATA_PROJEKTU 
FROM                [BAZAŹRÓDŁO].[dbo].[TABELAŹRÓDŁO] 
WHERE [BAZAŹRÓDŁO].[dbo].[TABELAŹRÓDŁO].[NAZWA_PROJEKTU] NOT IN      
     (SELECT  NAZWA_PROJEKTU
     FROM         [BAZAŹRÓDŁO].[dbo].[TABELAŹRÓDŁO] WHERE        [BAZAŹRÓDŁO].[dbo].[TABELAŹRÓDŁO].[DATA_PROJEKTU] > '2017-01-01'
     GROUP BY     [BAZAŹRÓDŁO].[dbo].[TABELAŹRÓDŁO].[NAZWA_PROJEKTU]  
     HAVING       (COUNT(*) > 1)
     )

Zapytanie przechodzi ale kopiuje 0 wierszy ;) Sam zagnieżdżony select prawidłowo listuje nazwy projektów które są zduplikowane

W przyszłości chciałbym dorobić jakieś zadanie które cyklicznie będzie kopiować nowe projekty, oczywiście pomijając te już skopiowane, ale nad tym się jeszcze nie zastanawiałem.

Byłbym wdzięczny za pomoc ewentualnie jakąś podpowiedź

1

Przyznam, że nie do końca rozumiem w czym jest problem ale co do cykliczności polecam:
https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job
co do kopiowania tych rekordów, które już nie występują to polecam

WHERE  NOT EXISTS (SELECT...) 

lub distinct ... ale tak jak pisałem nie do końca rozumiem na czym polega problem

0

Łatwiej jakbyś opisal to zastepując nazwy BAZAŹÓDŁO BAZACEL użył A i B. Rozumiem, że chcesz przegrać i nie powielać. Ale nie rozumiem, jak chcesz identyfikować przegrane rekordy skoro nie masz nigdzie tej informacji przegrywanej?

Skoro mozesz żyć bez informacji z NAZWA_PROJEKTU to dlaczego nie włozysz do kolumny ProID, ID z tabeli źródłowej?

0

Ok, dzięki za podpowiedź.

Jeszcze raz - na razie chcę skopiować wybrane rekordy z A (źródło) do B (cel). Modyfikacja struktury tablel nie wchodzi w grę, gdyż z baz korzystają grube klienty, którym takie modyfikacje nie będą się podobały.

Problem w tym, że na źródle A.NAZWA_PROJEKTU występują duplikaty i puste pola które chce całkowicie pominąć przy kopiowaniu do B. Dodatkowo chce skopiować projekty nowsze niż 2017-01-01

INSERT INTO         DB_B.dbo.B (PName, PKStreet,  PKZip,  PKCity,  ProID, ProDta)
SELECT              ProName, ProKStreet, ProKZip, ProKCity, NAZWA_PROJEKTU,DATA_PROJEKTU 
FROM                [DB_A].[dbo].[A] 
WHERE [DB_A].[dbo].[A].[NAZWA_PROJEKTU] NOT IN      
     (SELECT  NAZWA_PROJEKTU
     FROM         [DB_A].[dbo].[A] WHERE        [DB_A].[dbo].[A].[DATA_PROJEKTU] > '2017-01-01'
     GROUP BY     [DB_A].[dbo].[A].[NAZWA_PROJEKTU]  
     HAVING       (COUNT(*) > 1)
     )

Wykonanie kodu kończy się sukcesem, ale nic nie kopiuje (0 row(s) affected)

@Panczo - sorry ale jestem zbyt cienki w temacie - na razie chcę skopiować jednorazowo projekty bez duplikatów. Późniejsze kopiowanie jest osobnym tematem.

0

skoro masz dodanych 0 rekordow tzn. że zapytanie;

SELECT              ProName, ProKStreet, ProKZip, ProKCity, NAZWA_PROJEKTU,DATA_PROJEKTU 
FROM                [DB_A].[dbo].[A] 
WHERE [DB_A].[dbo].[A].[NAZWA_PROJEKTU] NOT IN      
     (SELECT  NAZWA_PROJEKTU
     FROM         [DB_A].[dbo].[A] WHERE        [DB_A].[dbo].[A].[DATA_PROJEKTU] > '2017-01-01'
     GROUP BY     [DB_A].[dbo].[A].[NAZWA_PROJEKTU]  
     HAVING       (COUNT(*) > 1)
)

Zwraca 0 wierszy, czyli nazwa projektu jest użyta przynajmniej 2 razy, czyli własciwie nie masz projektu o unikalnej Nazwa_projektu

0

pisane z głowy ale powinno zadziałać:

insert into test_schema.b (nazwa)
select distinct nazwa from test_schema.a a
 where a.nazwa is not null
   and not exists (select 1 from test_schema.b b where b.nazwa = a.nazwa)

1 użytkowników online, w tym zalogowanych: 0, gości: 1