Veröffentlicht 8. August 200718 j 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
8. August 200718 j 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
9. August 200718 j 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...
9. August 200718 j 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>"...
9. August 200718 j 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
9. August 200718 j 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
9. August 200718 j 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?
10. August 200718 j 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*
10. August 200718 j Du bist ein Genie!! Vielen herzlichen Dank für deine Hilfe - es funktioniert wunderbar! lg Michael
11. August 200718 j 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?
11. August 200718 j wie könnte das in der Praxis aussehen? Kannst ein Beispiel geben vielleicht anhand meiner Abfrage (siehe weiter oben)? Danke!!
12. August 200718 j Moin, Ersetze z.B. T1.Price AS 'VK-Preis' einfach durch ROUND(T1.Price,2) AS 'VK-Preis' ... Gruß, Honky
12. August 200718 j 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
12. August 200718 j Ä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 )
13. August 200718 j 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
13. August 200718 j 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
13. August 200718 j 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
13. August 200718 j 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?
13. August 200718 j 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
13. August 200718 j 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...
15. August 200718 j Sorry, hatte die Tage es nicht geschafft zu antworten. Dann versuch einfach mal als -C OEM (Windows-Standard) oder RAW (ohne alles).
16. August 200718 j 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...
16. August 200718 j 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)
16. August 200718 j 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...").
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.