Zum Inhalt springen

Script für Datenbankabfrage in SQLServer2000


miprant

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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*

Link zu diesem Kommentar
Auf anderen Seiten teilen

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


Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...