Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

SQLCMD - Ausgabe in Datei nur bei Ergebnis größer 0

Frage Entwicklung Datenbanken

Mitglied: albossum

albossum (Level 1) - Jetzt verbinden

29.11.2009 um 00:51 Uhr, 10617 Aufrufe, 9 Kommentare

Hallo,

ich bin neu hier und habe schon einiges sinnvolles hier gefunden. Danke!
Allerdings habe ich zu einem Problem nichts finden können, vielleicht hatte das schon jemand:

Ich habe eine Batch-Datei geschrieben, die eine SQL-Datenbankabfrage (SQL Server Express 2005) vornimmt und in eine Datei ausgibt. Das funktioniert auch soweit.

1. wie kann ich die Ausgabe von "(X Zeilen betroffen)" verhindern?

2. wie kann ich verhindern, dass die Ausgabedatei auch dann erzeugt wird, wenn die Abfrage Null Zeilen als Ergebnis liefert?

Hintergrund ist der, dass die Batchdatei per Taskplanung im 30s - Takt gestartet werden soll. Das wären dann ja 2880 Dateien, von denen vielleicht nur 5 einen brauchbaren Inhalt haben.

Hat da jemand vielleicht nen Tipp?

Vielen Dank und liebe Grüße!

albossum
Mitglied: TsukiSan
29.11.2009 um 06:25 Uhr
Hallo albossum,

Hier kannst du dir dein Batchfile anpassen und mittels "delim" oder "token" die Sachen rausfiltern, die du nicht benötigst.

Gruss
Tsuki
Bitte warten ..
Mitglied: 60730
29.11.2009 um 09:49 Uhr
Moin,

@Tsuki:
Ein Schleifchen finde ich da aber arg übertrieben - genauso wie den Ansatz alle 30 sekunden ein SQL Statement loszujagen - in der Hoffnung ein neuer Datensatztreffer ist dabei.

@ albossum:

Du mußt nicht nur Ross sondern auch Reiter nenen - deine Batch - am liebsten in <code > - </ code> Blöcken.

Mittels:
find /v "Zeilen betroffen" "meine sql ausgabe.xyz" > "meine SQL Ausgabe.xyz"

Könntest du - wenn wir deinen Weg weitergehen - "Problem 1" umschiffen.

2) Tja - dazu müßte man die Abfrage kennen..

Gruß
Bitte warten ..
Mitglied: TsukiSan
29.11.2009 um 09:56 Uhr
Hallo Timo,

Du mußt nicht nur Ross sondern auch Reiter nennen - deine Batch - am liebsten in <code > - </ code> Blöcken.

das habe ich mir heute morgen auch gedacht, nur wollte ich nicht den ersten Advent zu arg angehen und von daher meine "profane" und allgemeine Antwort

Warten wir mal auf die Antwort vom TO

Einen schönen 1.Advent

Tsuki
Bitte warten ..
Mitglied: albossum
29.11.2009 um 13:05 Uhr
Also erstmal vielen Dank für die schnellen Antworten!

@Tsuki Deinen Link werde ich mir mal zu Gemüte führen...

@Timo
01.
find /v "Zeilen betroffen" "meine sql ausgabe.xyz" > "meine SQL Ausgabe.xyz"
klingt sehr interessant... Zum Verständnis: Es wird die durch die Abfrage erzeugte Datei durchsucht und alle Zeilen die NICHT den Suchstring enthalten werden in einer neuen Datei gespeichert? Dann bräuchte ich die erste Datei nur noch zu löschen, oder?

Ich dachte es gibt vielleicht was Allgemeines (Einen Schalter oder so) mit dem man das einstellen kann.

Mit dem Schalter "-h -1" kann ich ja auch die Ausgabe des headers unterbinden. Bei Problem 2 ist es ja auch nur entscheidend, ob ein Treffer erziehlt wird, oder nicht. Da kommt es ja auf die konkrete Abfrage eigentlich nicht an, oder?

Das 30s Intervall ist vielleicht etwas eng, aber viel größer sollte es auch nicht sein. Es geht darum in einer Software einen Flag zu setzen um dann automatisiert mit einer anderen Software Daten zu verarbeiten und einen Druck zu starten. Zwischen "Flag setzen" und dem Druck sollten nun eben keine Ewigkeiten vergehen...

Aber fürs Verständnis:

Der SQLCMD Aufruf aus der Batch (die Variablen werden oben in der Batch gesetzt), Die Batch und die Abfrage funktionieren auch zuverlässig.
01.
SQLCMD -U %benutzername% -P %passwort% -S %server% -d %datenbank% -i %arbeits_sql% -o %datei% -W -s "|" -h -1
und die Abfrage
01.
SELECT  
02.
 
03.
 
04.
	Referenz, 
05.
	Kundennummer, 
06.
	Name, 
07.
	Strasse, 
08.
	PLZ, 
09.
	Ort, 
10.
        Land, 
11.
	Email 
12.
 
13.
FROM 
14.
 
15.
	Addresses 
16.
 
17.
WHERE 
18.
 
19.
	Flag = -1 
20.
 
21.
GO
Eine Idee wäre vor der SQL-Abfrage mit Dateiausgabe eine quasi "Prüfabfrage" zu starten, die prüft, ob es Ergebnisse gibt (natürlich ohne Ausgabe in eine Datei). Dann müßte man aber das Abfrageergebnis für eine IF-Anweisung zur Verfügung haben.

Oder man lässt das Prüfergebnis doch in eine Datei schreiben, die man dann auswertet, indem man filtert wie viel Zeilen die Abfrage liefert... (steht ja in der Datei drin)

Ist das sinnvoll und machbar?

Ich muss sagen, dass ich mich in die SQLCMD - Problematik erst kürzlich eingelesen habe und hier sicher kein Profi bin. Ebenso habe ich mit Batchdatein bisher nur in rudimentärer Weise gearbeitet. Mit Dateien auslesen unfdanalysieren habe ich mich bisher noch nicht beschäftigt. Komme eher aus dem WEB -Bereich mit PHP, HTML, JavaScript usw.

Bin daher für jeden Vorschlag offen!

Besten Dank und einen schönen 1. Advent.

Gruß

Albossum
Bitte warten ..
Mitglied: albossum
29.11.2009 um 13:36 Uhr
Was mir grad einfällt...

auf die gleiche Weise, wie @Timo vorgeschlagen hat Problem 1 zu lösen könnte man doch auch Problem 2 angehen...

Man könnte prüfen ob die durch die SQL-Abfrage erzeugte Datei den String "0 Zeilen betroffen" enthält und wenn das so ist, dann wird die Datei gelöscht.

Ist sicher nicht die eleganteste Methode, aber sollte gehen, oder?

Und um zu verhindern, dass sich die 2. Software die Datei schon greift, bevor die Prüfung abgeschlossen ist könnte man die Datei ja erstmal in ein TEMP-Verzeichnis schreiben lassen und wenn mehr als 0 Zeilen gefunden wurden wird sie in das Arbeitsverzeichnis der 2. Software verschoben, sonst gelöscht.

Was haltet Ihr davon?

Besser würde mir aber natürlich gefallen, wenn die Datei gar nicht erst erzeugt werden würde, wenn es keine Ergebnisse gibt...

Gruß

albossum
Bitte warten ..
Mitglied: MadMax
30.11.2009 um 02:05 Uhr
Hallo albossum,

zu 1.: Ein "set nocount on" am Anfang Deines Skriptes verhindert die Ausgabe der Anzahl der betroffenen Zeilen.

zu 2.: Die Ausgabe ganz unterbinden dürfte nicht funktionieren (wenn doch, dann vielleicht über den SQLCMD-Befehl ":out"), aber das SQL-Skript kann Dir zurückgeben, ob Daten gefunden wurden und dementsprechend kannst Du die Datei dann löschen. Das würde dann so aussehen:

Batch:
01.
SQLCMD -U %benutzername% -P %passwort% -S %server% -d %datenbank% -i %arbeits_sql% -o %datei% -W -s "|" -h -1 -b 
02.
if errorlevel 1 del %datei%
Skript:
01.
set nocount on 
02.
 
03.
SELECT  
04.
 
05.
 
06.
	Referenz, 
07.
	Kundennummer, 
08.
	Name, 
09.
	Strasse, 
10.
	PLZ, 
11.
	Ort, 
12.
        Land, 
13.
	Email 
14.
 
15.
FROM 
16.
 
17.
	Addresses 
18.
 
19.
WHERE 
20.
 
21.
	Flag = -1 
22.
 
23.
if @@rowcount = 0 raiserror (0, 11, 0)
Der Parameter "-b" sorgt dafür, daß SQLCMD mit errorlevel 1 beendet wird, wenn ein Fehler > 10 auftritt. Mit der Zeile "if @@rowcount = 0 raiserror (0, 11, 0)" sorgen wir dafür, daß eben das passiert, wenn keine Daten zurückgegeben werden. Nach dem SQLCMD wird dann auf den errorlevel geprüft und ggf. eine leere Datei gelöscht.

Gruß, Mad Max
Bitte warten ..
Mitglied: albossum
30.11.2009 um 02:27 Uhr
Hallo Mad Max,

Deine Lösung klingt sehr gut, probier ich gleich aus...

Danke!!! (an alle)

Gruß

albossum
Bitte warten ..
Mitglied: albossum
01.12.2009 um 15:48 Uhr
Hallo,

Ich habe Mad MAx´ Lösung ausprobiert und noch etwas angepasst. Es wird eine Prüfabfrage durchgeführt. Nur wenn diese Ergebnisse liefert wird die eigentliche Abfrage ausgeführt, die eine Ausgabe in eine Datei erzeugt. Somit muss auch nix mehr gelöscht werden.

Batch:
01.
REM Start der Prüf-Datenbankabfrage 
02.
 
03.
SQLCMD -U %benutzername% -P %passwort% -S %server% -d %datenbank% -i %pruef_sql% -W -s "|" -h -1 -b 
04.
 
05.
REM Start der Arbeits-Datenbankabfrage 
06.
 
07.
if NOT errorlevel 1 SQLCMD -U %benutzername% -P %passwort% -S %server% -d %datenbank% -i %arbeits_sql% -o %datei% -W -s "|" -h -1 -b
pruef_sql
01.
SELECT  
02.
	Referenz 
03.
FROM 
04.
	Addresses 
05.
WHERE 
06.
	Flag = -1 
07.
 
08.
if @@rowcount = 0 raiserror (13001, 11, 1)
arbeits_sql
01.
set nocount on 
02.
 
03.
SELECT  
04.
	Referenz, 
05.
	Kundennummer, 
06.
	Name, 
07.
	Strasse, 
08.
	PLZ, 
09.
	Ort, 
10.
        Land, 
11.
	Email 
12.
FROM 
13.
	Addresses 
14.
WHERE 
15.
	Flag = -1 
16.
 
17.
if @@rowcount = 0 raiserror (13001, 11, 1)
"if @@rowcount = 0 raiserror (0, 11, 0)" musste ich anpassen, da es eine Fehlermeldung gab, die meinte, die Message-ID sollte ab 13000 sein. (Keine Ahnung warum)

Also vielen Dank nochmal an alle Helfer!

Gruß

albossum
Bitte warten ..
Mitglied: blacky85
29.04.2014 um 12:44 Uhr
Hey, habe die gleiche Idee gehabt, mir eine Batch geschrieben welche die SQL Abfrage startet.
Nun ist meine Frage, ob man diese Batchdatei die ja den Benutzername und Passwort enthält noch irgendwie schützen kann.

Zwar liegt diese Datei auf einem Server wo keiner Zugriff, außer dem Admin, aber wo ein Wille ist, ist auch ein Weg.

Habt ihr eine Idee oder mach ich mir da zu viele Sorgen?
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

IDE & Editoren
USB STICK Datei AUTOMATISCH beim anschliessen auf fremden PC öffnen (9)

Frage von Jwanner83 zum Thema IDE & Editoren ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...