Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Script für Datenbankabfrage in SQLServer2000

Empfohlene Antworten

Veröffentlicht

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

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

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... ;)

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>"...

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 ;)

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

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?

Nichts leichter als das...

Habe jetzt 1:1 das Select aus deinem ersten Post übernommen (zugegeben, habs ein wenig eingerückt :D). 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*

Du bist ein Genie!! Vielen herzlichen Dank für deine Hilfe - es funktioniert wunderbar! :)

lg

Michael

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?

z.b. ROUND(bla, 2)

s'Amstel

wie könnte das in der Praxis aussehen? Kannst ein Beispiel geben vielleicht anhand meiner Abfrage (siehe weiter oben)? Danke!! :)

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

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

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


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

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?

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

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... ;)

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...

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)

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.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.