[MSSQL] Merge in generieke stored proc

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 08:48
Ik ben bezig met een aantal MERGE statements in SQL2008. Werkt prima, maar die statements moet je steeds helemaal uitschrijven (INSERT met velden erbij, UPDATE met velden erbij, etc). Dit terwijl de bron en doel tabellen qua definitie exact hetzelfde zijn.

Is het mogelijk om de MERGE te verpakken in een stored proc waarbij je vervolgens aangeeft

proc_merge('tabelA', 'tabelB')

zonder je nog ergens zorgen over te moeten maken? Scheelt me een hoop tijd als ik het op dit manier kan doen, een keer uitwerken en daarna niet meer naar omkijken. Iemand enig idee of dit mogelijk is?

Acties:
  • 0 Henk 'm!

  • lier
  • Registratie: Januari 2004
  • Laatst online: 11:30

lier

MikroTik nerd

Dus je bent op zoek naar een stored procedure om op basis van twee tabellen die als parameter meegegeven moeten worden een merge uit moet voeren?

Lees eventueel dit artikel, hierin wordt beschreven hoe je stored procedures moet aanmaken.

Eerst het probleem, dan de oplossing


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 08:48
lier schreef op vrijdag 24 september 2010 @ 16:57:
Dus je bent op zoek naar een stored procedure om op basis van twee tabellen die als parameter meegegeven moeten worden een merge uit moet voeren?

Lees eventueel dit artikel, hierin wordt beschreven hoe je stored procedures moet aanmaken.
Ik weet wel hoe ik een stored procedure aan moet maken....

Het gaat me om het feit dat een MERGE query nu zo statisch als de pest is. Je moet opgeven welke tabellen het om gaat, welke velden je wilt gebruiken als keys om de twee met elkaar te vergelijken, hoe de insert eruit moet zien en hoe de update moet werken; een hoop werk wat je steeds moet herhalen.

Allemaal uitstekend, maar ik zit vaak met tabellen die ik gewoon 1-op-1 wil kopieren van database A naar database B. Nu zou je zeggen: tabel verwijderen en SELECT INTO gebruiken, maar dan creeer je dus een moment waarop de data niet beschikbaar is; niet wenselijk. Een MERGE is dus wenselijk, vaak aangevuld met een controle op datum (MERGE alle records die na tijdstip x gewijzigd zijn, en verwijder records die inmiddels niet meer bestaan in de bron tabel).

Het zou me een hoop gedoe besparen als er voor bovenstaand scenario, waarbij de tabellen in database A en B gelijk zijn aan elkaar qua structuur, een simpel statement zou zijn.

Dus: update tabel A met data uit tabel B, gebruik de primary key uit de tabellen (die dus ook gelijk is) en sync alleen records waarvan de datum in veld X (datum laatst gewijzigd) groter of gelijk is aan datum Y. Dat alles in 1 call.

SYNC(DB1.dbo.Tabel, DB2.dbo.Tabel, '2010-25-09 00:00:00');

Zo'n stored procedure valt wel te maken denk ik, maar ik kan me zo slecht voorstellen dat ik de eerste ben die dit verzint. Oftewel: hij bestaat vast al, toch!?

Het mooie hieraan is dat je o.a. met Linked Servers ook data kan overhalen uit andere databases dan SQL server, dus het is meteen een cross platform oplossing.

Wellicht zie ik soortgelijke opties over het hoofd, dat kan ook; wijs me daar dan aub op :)

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
iCe01 schreef op zaterdag 25 september 2010 @ 16:35:
Wellicht zie ik soortgelijke opties over het hoofd, dat kan ook; wijs me daar dan aub op :)
Replication?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 11:28

Crazy D

I think we should take a look.

Query dynamisch opbouwen en via sp_executesql laten uitvoeren?
Of wel voor iedere tabel een eigen merge-stored procedure, en deze sp's genereren :)

Exact expert nodig?


Acties:
  • 0 Henk 'm!

  • joppybt
  • Registratie: December 2002
  • Laatst online: 18-09 23:33
Of, als de tabellen inderdaad identiek zijn misschien eerst iets van:
code:
1
2
3
INSERT INTO doel
SELECT * FROM bron
MINUS SELECT * FROM doel

Dan heb je het INSERT deel heel eenvoudig gehad en hoef je alleen nog naar de update te kijken.

Acties:
  • 0 Henk 'm!

  • DigiK-oz
  • Registratie: December 2001
  • Laatst online: 18-09 21:39
Moet het in een SP of query? Anders zou je eens kunnen kijken naar export/import (dan is wel in je doeldatabase de tabel even leeg), of naar tablediff (standalone .exe die bij MSSQL zit, kan een tabel met verschillen aanmaken en/of een script om de tabellen gelijk te trekken).

Whatever


Acties:
  • 0 Henk 'm!

  • palloquin
  • Registratie: Juli 2000
  • Laatst online: 29-01-2021
Hoewel ik nooit met MERGE gewerkt heb, lijkt het me dat je inderdaad naar een dynamische query moet... kan nooit heel lastig zijn, als de tabellen identiek zijn moet je door de velden van 1 tabel heen loopen en deze toevoegen aan je SQL statement... uurtje werk ofzo?
Pagina: 1