miprant Geschrieben 8. August 2007 Teilen Geschrieben 8. August 2007 Hallo, möchte eine SQL-Datenbankabfrage täglich automatisiert starten und zwar mit dem Ziel, dass ich das Ergebnis in einem Trennzeichen-getrennten CSV-file in einen bestimmten Ordner am Server bekomme. Wer kann mir mit einem Skript dafür helfen? Am liebsten würde ich das ganze über ein batch-file als scheduled task laufen lassen, habe aber keine Ahnung wie das geht. Bin für jede produktive Hilfe dankbar! lg Michael P.S. ich verwende SQL-Server 2000 Enterprise Edition installiert auf einem Windows Server 2003 Standard. P.P.S: Hier die Abfrage: SELECT T0.ItemCode, T0.ItemName AS 'Artikelbeschreibung deu kurz', T3.FirmName AS 'Marke', T0.SuppCatNum AS 'Lief.art.nr.', T0.SalUnitMsr AS 'ME', T0.VatGourpSa AS 'SteuerID', T0.OnHand, T0.UserText AS 'Artikelbeschreibung deu lang', T0.U_Descrip2 AS 'Artikelbeschreibung ital kurz', T0.U_Detail2 AS 'Artikelbeschreibung ita lang', T0.U_Descrip1 AS 'Aritkelbeschreibung eng kurz', T0.U_Detail1 AS 'Artikelbeschreibung eng lang', T0.U_webshop AS 'Aktiv', T0.U_webVfb2 AS 'Liefertage', T0.U_webVfb1 AS 'Sortierung', T1.Price AS 'VK-Preis', T0.U_EPA_spec AS 'Angebot', T0.U_mk1bez AS 'Groesse', T0.U_mk2bez AS 'Farbe', T0.U_farbeI AS 'Farbe ita', T0.U_farbeE AS 'Farbe eng', T1.Price, T1.PriceList, T0.U_wgrpnr AS 'Gruppe', T0.U_EPAObjID AS 'UGR', T0.U_EPA_supr AS 'UGR_2', T0.U_EPA_crss AS 'Artikelzusätze', T0.QryGroup1 AS 'Damen', T0.QryGroup2 AS 'Herren', T0.QryGroup3 AS 'Kinder', T0.QryGroup4 AS 'Erwachsene', T0.U_EPA_prod AS 'Versandkostenfrei' FROM OITM T0 INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode INNER JOIN OMRC T3 ON T0.FirmCode = T3.FirmCode WHERE T0.U_webshop ='Y' AND T1.PriceList =2 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 8. August 2007 Teilen Geschrieben 8. August 2007 ich würde allenfalls bei osql bzw. sqlcmd ansetzen - ersteres sollte auch bei 2000 mitgeliefert werden, zweiteres lässt zumindest die verbindung zu 2000 zu. s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 9. August 2007 Autor Teilen Geschrieben 9. August 2007 ich würde allenfalls bei osql bzw. sqlcmd ansetzen - Das dachte ich mir schon. osql ist am Server installiert.Aber da ich ein absoluter Neuling in Sachen SQL bin hatte ich gehofft, es hätte hier jemand ein Beispiel für so ein osql Script, damit ich sehe wie so ein script auszusehen hat. Das Problem ist nämlich nicht die automatisierte Abfrage (die kann ich im SQL Server Agent auch starten) - aber das automatiserte Erstellen und Abspeichern eines CSV-Files (mit TRENNZEICHEN). Im Server Agent bekomme ich keine Trennzeichen hin und in den ersten zwei Zeilen kommt ein Hinweistext... D. h. ich brauche jemanden, der sich auskennt... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Honkytonk Geschrieben 9. August 2007 Teilen Geschrieben 9. August 2007 Meiner Meinung nach ist das bcp-Tool für deine Sache deutlich geeigneter, da es für den (Im- &) Export von Daten gedacht ist. Versuch mal auf der Kommandozeile bcp "[I]<dein_statement>[/I]" queryout [I]<name_der_gewünschten_csv_datei>[/I] -S [I]<server_name>[/I] -U [I]<benutzer>[/I] -P [I]<passwort>[/I] -t ";" -c Wenn du über die integrierte Windowssicherheit kommst, kannst du "-S <server_name> -U <benutzer>" streichen und durch "-T" (Trusted Connection) ersetzen. Gruß, Honky PS: Um es übersichtlicher zu machen kannst du dein Select auch in einer Stored Procedure speichern und stattdessen nur "exec <Prozedurname aufrufen>"... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 9. August 2007 Autor Teilen Geschrieben 9. August 2007 Hi Honky, danke für den Tipp. Allerdings muss ich da ja noch irgendwie den Namen der Datenbank einbauen, oder? ...so läufts nämlich nicht... Aber wo? und wie? :confused: Sorry für meine Inkompetenz - aber vielleicht wird's ja doch noch Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Honkytonk Geschrieben 9. August 2007 Teilen Geschrieben 9. August 2007 Macht ja nix. Sollte eigentlich reichen wenn du in deine FROM-Clause die Voll-Referenzierung einpflegst, also FROM [B][I]<meine_DB>[/I]..[/B]OITM T0 INNER JOIN [B][I]<meine_DB>[/I]..[/B]ITM1 T1 Deswegen wär´s evtl. besser wenn du den ganzen Kram in eine Stored Procedure wirfst und die auf der entsprechenden DB ablegst. Dann müsstest du nur die aufrufen... Gruß, Honky Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 9. August 2007 Autor Teilen Geschrieben 9. August 2007 das mit der Stored Procedur würd ich gern machen, aber keine Ahnung wie das geht... Könntest du mir dafür auch eine kurze Anleitung geben? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Honkytonk Geschrieben 10. August 2007 Teilen Geschrieben 10. August 2007 Nichts leichter als das... Habe jetzt 1:1 das Select aus deinem ersten Post übernommen (zugegeben, habs ein wenig eingerückt ). Speicher den Code einfach in eine .sql-Datei ab ... USE <deine_datenbank_wo_die_tabellen_liegen> GO IF EXISTS(SELECT * FROM sysobjects WHERE type = 'P' AND name = 'stprGetCSVData') DROP PROCEDURE stprGetCSVData GO ------------------------------------------------------------------------------------------- -- stprGetCSVData -- -- erstellt von: Honkytonk -- erstellt am : 10.08.2007 -- -- Aufgabe: Ermittelt die Daten für das Report-XML-Schema ------------------------------------------------------------------------------------------- CREATE PROCEDURE [dbo].[stprGetCSVData] AS SELECT T0.ItemCode, T0.ItemName AS 'Artikelbeschreibung deu kurz', T3.FirmName AS 'Marke', T0.SuppCatNum AS 'Lief.art.nr.', T0.SalUnitMsr AS 'ME', T0.VatGourpSa AS 'SteuerID', T0.OnHand, T0.UserText AS 'Artikelbeschreibung deu lang', T0.U_Descrip2 AS 'Artikelbeschreibung ital kurz', T0.U_Detail2 AS 'Artikelbeschreibung ita lang', T0.U_Descrip1 AS 'Aritkelbeschreibung eng kurz', T0.U_Detail1 AS 'Artikelbeschreibung eng lang', T0.U_webshop AS 'Aktiv', T0.U_webVfb2 AS 'Liefertage', T0.U_webVfb1 AS 'Sortierung', T1.Price AS 'VK-Preis', T0.U_EPA_spec AS 'Angebot', T0.U_mk1bez AS 'Groesse', T0.U_mk2bez AS 'Farbe', T0.U_farbeI AS 'Farbe ita', T0.U_farbeE AS 'Farbe eng', T1.Price, T1.PriceList, T0.U_wgrpnr AS 'Gruppe', T0.U_EPAObjID AS 'UGR', T0.U_EPA_supr AS 'UGR_2', T0.U_EPA_crss AS 'Artikelzusätze', T0.QryGroup1 AS 'Damen', T0.QryGroup2 AS 'Herren', T0.QryGroup3 AS 'Kinder', T0.QryGroup4 AS 'Erwachsene', T0.U_EPA_prod AS 'Versandkostenfrei' FROM OITM T0 INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode INNER JOIN OMRC T3 ON T0.FirmCode = T3.FirmCode WHERE T0.U_webshop ='Y' AND T1.PriceList =2 go .. und führe sie mit [I]osql -S . -E -i <dein_datei_name>.sql[/I] aus. Der BCP-Aufruf reduziert sich dann auf bcp "exec [I]<deine_datenbank>[/I]..stprGetCSVData" queryout [I]<name_der_gewünschten_csv_datei>[/I] -S [I]<server_name>[/I] -U [I]<benutzer>[/I] -P [I]<passwort>[/I] -t ";" -c Viel Spaß beim ausprobieren... *Kaffee schlürf* Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 10. August 2007 Autor Teilen Geschrieben 10. August 2007 Du bist ein Genie!! Vielen herzlichen Dank für deine Hilfe - es funktioniert wunderbar! lg Michael Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 11. August 2007 Autor Teilen Geschrieben 11. August 2007 Hi, habe noch eine kleine Frage und zwar habe ich der SQL-Tabelle mit den Preisen 5 Stellen hinterm Komma, benötige aber nur zwei. Kann ich in der Abfrage noch irgendwo einfügen, dass er mir nur zwei Kommastellen ausgibt? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Amstelchen Geschrieben 11. August 2007 Teilen Geschrieben 11. August 2007 z.b. ROUND(bla, 2) s'Amstel Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 11. August 2007 Autor Teilen Geschrieben 11. August 2007 wie könnte das in der Praxis aussehen? Kannst ein Beispiel geben vielleicht anhand meiner Abfrage (siehe weiter oben)? Danke!! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Honkytonk Geschrieben 12. August 2007 Teilen Geschrieben 12. August 2007 Moin, Ersetze z.B. T1.Price AS 'VK-Preis' einfach durch ROUND(T1.Price,2) AS 'VK-Preis' ... Gruß, Honky Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 12. August 2007 Autor Teilen Geschrieben 12. August 2007 Hallo Honky! ROUND(T1.Price,2) AS 'VK-Preis' funktioniert leider nicht. Habe die Zeile genauso geändert und trotzdem gibt's inder csv-Datei immer noch 5 Kommastellen... Gibts noch eine Alternative? lg Michael Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Honkytonk Geschrieben 12. August 2007 Teilen Geschrieben 12. August 2007 Ähm, hast du die Prozedur mit dem Code denn nochmal neu angelegt oder hast du das Select auf der DB ausgeführt? Welchen Datentyp hat denn die Spalte? (morgen kann sonst erst morgen wieder richtig testen, lt. T-SQL Referenz sollte die Syntax aber stimmen ) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 13. August 2007 Autor Teilen Geschrieben 13. August 2007 habe den Code lediglich in der Prozedur (*.sql) geändert. Die einzelnen Schritte lass ich über ein *.cmd file ausführen (osql... bcp... ftp...) Data Type = numeric Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 13. August 2007 Autor Teilen Geschrieben 13. August 2007 habe den Code lediglich in der Prozedur (*.sql) geändert. Die einzelnen Schritte lass ich über ein *.cmd file ausführen (osql... bcp... ftp...) Data Type = numeric Inhalt der .sql datei: USE hutstuebele GO IF EXISTS(SELECT * FROM sysobjects WHERE type = 'P' AND name = 'stprGetCSVData') DROP PROCEDURE stprGetCSVData GO ------------------------------------------------------------------------------------------- -- stprGetCSVData -- -- erstellt von: Honkytonk -- erstellt am : 10.08.2007 -- -- Aufgabe: Ermittelt die Daten für das Report-XML-Schema ------------------------------------------------------------------------------------------- CREATE PROCEDURE [dbo].[stprGetCSVData] AS SELECT T0.ItemCode, T0.ItemName AS 'Artikelbeschreibung deu kurz', T3.FirmName AS 'Marke', T0.SuppCatNum AS 'Lief.art.nr.', T0.SalUnitMsr AS 'ME', T0.VatGourpSa AS 'SteuerID', T0.OnHand, T0.UserText AS 'Artikelbeschreibung deu lang', T0.U_Descrip2 AS 'Artikelbeschreibung ital kurz', T0.U_Detail2 AS 'Artikelbeschreibung ita lang', T0.U_Descrip1 AS 'Aritkelbeschreibung eng kurz', T0.U_Detail1 AS 'Artikelbeschreibung eng lang', T0.U_webshop AS 'Aktiv', T0.U_webVfb2 AS 'Liefertage', T0.U_webVfb1 AS 'Sortierung', ROUND(T1.Price,2) AS 'VK-Preis', T0.U_EPA_spec AS 'Angebot', T0.U_mk1bez AS 'Groesse', T0.U_mk2bez AS 'Farbe', T0.U_farbeI AS 'Farbe ita', T0.U_farbeE AS 'Farbe eng', ROUND(T1.Price,2) AS 'VK-Preis2', T1.PriceList, T0.U_wgrpnr AS 'Gruppe', T0.U_EPAObjID AS 'UGR', T0.U_EPA_supr AS 'UGR_2', T0.U_EPA_crss AS 'Artikelzusätze', T0.QryGroup1 AS 'Damen', T0.QryGroup2 AS 'Herren', T0.QryGroup3 AS 'Kinder', T0.QryGroup4 AS 'Erwachsene', T0.U_EPA_prod AS 'Versandkostenfrei' FROM OITM T0 INNER JOIN ITM1 T1 ON T0.ItemCode = T1.ItemCode INNER JOIN OMRC T3 ON T0.FirmCode = T3.FirmCode WHERE T0.U_webshop ='Y' AND T1.PriceList =2 go Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 13. August 2007 Autor Teilen Geschrieben 13. August 2007 Hi Honky, Problem hat sich jetzt erledigt. Ich habe die php-Schnittstelle auf der anderne Seite sozusagen an die sql-Ausgabe im csv angepasst. Vielen Dank für deine Hilfe! Michael Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 13. August 2007 Autor Teilen Geschrieben 13. August 2007 Hallo nochmal! Anscheinend stehen in der csv-Datei noch Zeilenumbrüche, die man offensichtlich nicht sieht. Die Schnittstelle auf der anderen Seite hat allerdings ein Problem damit. Frage: kann ich irgendwo einbauen, dass KEINE Formatierung exportiert wird (v. a. keine Zeilenumbrüche)? Übrigens: das bcp führe ich u. a. mit dem Parameter -C "UTF-8" aus - muss ich eine andere codierung verwenden und wenn ja, welche? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Honkytonk Geschrieben 13. August 2007 Teilen Geschrieben 13. August 2007 Re-Hallo! Öhm, was erwartet die andere Seite denn als Formatierung? Passend zum Trennzeichen der Spalten (Feldabschlusszeichen), gibt es auch Zeilenabschlusszeichen (-r). Mehr dazu hier Option -C erwartet normalerweise nur ACP, OEM , RAW oder die Codepage-Nummer. Weiß nicht ob du da direkt "UTF-8" angeben kannst. (Übersicht über die Codepages findest du hier) Gruß, Honky Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 13. August 2007 Autor Teilen Geschrieben 13. August 2007 am besten wäre KEINE Formatierung. Im Prinzip wär's ja egal, aber wenn zwischendrin Zeilenumbrüche sind, dann erkennt die Schnittstelle sie als neue Artikel und dann gibts Probleme. Das mit dem UTF-8 hab ich nur ausprobiert. Ohne Angabe hat's mir die Umlaute als Sonderzeichen ausgegeben, mit UTF-8 hat's gepasst... daher hab ich's so belassen... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Honkytonk Geschrieben 15. August 2007 Teilen Geschrieben 15. August 2007 Sorry, hatte die Tage es nicht geschafft zu antworten. Dann versuch einfach mal als -C OEM (Windows-Standard) oder RAW (ohne alles). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 16. August 2007 Autor Teilen Geschrieben 16. August 2007 Habs probiert - die Umlaute werden leider nur mit der Einstellung UTF-8 richtig dargestellt. Vermute, dass diese "unsichtbaren" Zeilenumbrüche mit dem bcp... queryout... zu tun haben. Warum ich das vermute? Wenn ich den Export über unsere WaWi ins Excel mache und dann als CSV speichere, gibts keine Probleme. Gibt es für bcp oder queryout irgendwelche Optionen/Parameter, die man zusätzliche setzen kann um nur den reinen Text in der Zieldatei zu haben? Bin für jede Hilfe echt dankbar, da ich keinen Millimeter mehr weiterkomme... Der Import auf der anderen Seite kann nämlich mit diesen Zeilenumbrüchen nicht durchgeführt werden... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Honkytonk Geschrieben 16. August 2007 Teilen Geschrieben 16. August 2007 Okay, dann sollten wir das Format auf UTF-8 belassen. Inwiefern hast du denn nun mit Zeilenabschlusszeichen getestet? z.B. bcp "exec <deine_datenbank>..stprGetCSVData" queryout <name_der_gewünschten_csv_datei> -S <server_name> -U <benutzer> -P <passwort> -t ";" [B]-r "\0"[/B] -c bzw. bcp "exec <deine_datenbank>..stprGetCSVData" queryout <name_der_gewünschten_csv_datei> -S <server_name> -U <benutzer> -P <passwort> -t ";" [B]-r ""[/B] -c (letzteres sollte keinerlei Zeichen am Ende einer Zeile erzeugen, ersteres ein nicht-sichtbares Nullabschlusszeichen) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
miprant Geschrieben 16. August 2007 Autor Teilen Geschrieben 16. August 2007 Hab ich beides schon probiert - leider auch ohne Erfolg. Es scheint dabei Probleme mit dem Export zu geben, da in Excel sich die Datei bei beiden Optionen nicht mehr vollständig öffnen lässt ("...Datei kann nicht vollständig geladen werden..."). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.