Neu CSV-Datei direkt in einer SQL-Abfrage verwenden

mvh

Sehr aktives Mitglied
26. Oktober 2011
744
265
Moin.

Im Forum sehe ich sehr oft eine Frage - wie kann ich Lieferantenpreise oder Lieferantenbestände täglich (stündlich/viertelstündlich/alle 5 Minuten) aktualisieren.
Das Szenario: ich lade eine CSV-Datei (oder XML-Datei) vom Lieferanten runter und dort sind neue Preise/Bestände/etc. enthalten.
Hier wird oft Ameise oder bcp.exe (bulk copy utility) oder BULK INSERT (SQL Server Abfrage) oder "ich kenne ein Programm" als eine Lösung
vorgeschlagen, was dann immer zusätzliche Schritte, Fehlerquellen, Tabellen, Kosten, etc. mit sich bringt.

Hier was ich vorschlage:
Wir nutzen eine im SQL Server eingebaute Verbindungsart (OPENROWSET BULK mit Formatfile),
was diese Nachteile nicht hat und in Sekunden (eigentlich Millisekunden) ausgeführt wird.
Hier ein Beispiel für einen Lieferanten von uns (FEBI)
SQL:
UPDATE lief
SET fLagerbestand=TRY_CAST(ISNULL(febi.AVAIL_QUANTITY,0) as int), dLBGeaendert=GETDATE()
FROM [dbo].[tliefartikel] lief
INNER JOIN dbo.tArtikel ta ON lief.tArtikel_kArtikel=ta.kArtikel
 LEFT JOIN OPENROWSET (
        BULK 'D:\Lieferantenbestellung\febi_availability_febi_Full.csv',
        FIRSTROW=2,
        FORMATFILE = 'D:\Lieferantenbestellung\FEBI.fmt' 
       ) febi ON (lief.cLiefArtNr=febi.MATERIAL) --(febi.EAN=ta.cBarcode AND ISNULL(ta.cBarcode,'')<>'' AND ISNULL(febi.EAN,'')<>'') OR (ta.cHAN=febi.MATERIAL)
  WHERE tLieferant_kLieferant=104 AND cLiefArtNr<>'NICHT MEHR LIEFERBAR'
  AND fLagerbestand<>TRY_CAST(ISNULL(febi.AVAIL_QUANTITY,0) as int);
Ich würde die Erstellung dieser Abfrage sehr detailliert und öffentlich hier erklären, aber nur wenn überhaupt das Interesse besteht.
Sonst wäre der Aufwand für mich einfach zu groß.
Viele Grüße, Ihr MVH-Team
 

ple

Sehr aktives Mitglied
20. August 2019
548
119
Das würde mich auch interessieren. Die Ameise ist beim quicksync nicht die schnellste ;-(