Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   bcp als batchdatei (https://www.delphipraxis.net/195600-bcp-als-batchdatei.html)

TheMemo 13. Mär 2018 15:19

Datenbank: MS SQL • Version: 2012 • Zugriff über: bcp

bcp als batchdatei
 
Hallo ich habe ein Problem mit der Ausführung eines Batchbefehles für bcp.

Der Datenbankname wird durch das eigentliche Programm teils automatisch angelegt:
DB_Name:durchMitarbeitervergebenerName+{F010E787-D376-43DC-A021-F1441EDB85A2}

Führe ich den Befehl direkt in der Shell aus, funtioniert er wunderbar:
Code:
bcp "SELECT FieldInfo.Account, LEN(FieldInfo.Account) AS LaengeAccount,Data.fact,Data.idLevel, Data.idTime, FieldInfo.FieldName FROM dbo.tbl_DataCube AS Data INNER JOIN dbo.tbl_FieldMember AS Fields ON Data.idField = Fields.idField INNER JOIN dbo.tbl_FieldMemberInfo AS FieldInfo ON Fields.idField = FieldInfo.idField WHERE (FieldInfo.Account LIKE N'001001%') AND (Data.idLevel = '3') AND (Data.idTime > '183')" queryout "\\Netzlaufwerk\Daten_Dummy.exp" -T -c -d durchMitarbeitervergebenerName+{F010E787-D376-43DC-A021-F1441EDB85A2}
Führe ich ihn als Batch aus, startet er den Kopiervorgang, kopiert aber 0 Zeilen und beendet die Ausführung ohne Fehlermeldung.
Die bestehende Datei auf dem Netzlaufwerk wird dabei auch durch eine leere ersetzt.

Ich habe versucht den DBNamen nochmal zu escapen (',''), aber dann beschwert er sich gleich, das die Datenbank nicht gefunden werden kann.

Vielleicht hat ja jemand von euch eine Idee.

himitsu 13. Mär 2018 15:48

AW: bcp als batchdatei
 
Kein Fehler oder nur keinen Fehler gesehn?

Notfalls einfach mal alle Wege und Werte überprüfen/speichern.
Code:
bcp "SELECT....  -e D:\Error.log -o D:\Output.log > D:\OutputMsg.log 2> D:\OutputErr.log
if errorlevel 1   echo %errorlevel% > D:\ErrorLevel.log
Zitat:

Ich habe versucht den DBNamen nochmal zu escapen (',''), aber
Wie?

Für einen halbwegs ordentlichen Kommandozeilenparser sollte xxx und "xxx" das Gleiche sein.
Bei xxx und x"xx" sieht es manchmal aber anders aus.

TheMemo 13. Mär 2018 16:04

AW: bcp als batchdatei
 
Vielen Dank schonmal für eine Antwort.

Den Escape Versuch habe ich mit einfachen 'DB_Name' und doppelten Hochkommata''DB_Name'' gemacht.
Anführungszeichen "DB_Name" werden auch korrekt erkannt, aber kein Unterschied im Verhalten (direkt in der Shell geht, über Batch nicht).

Das Output.log sagt:
"Kopiervorgang wird gestartet...

0 Zeilen kopiert.
NetzwerkpaketgrӇe (Bytes): 4096
Zeit (ms.) gesamt: 1"

Das error.log, OutputErr.log und OutputMsg.log bleiben leer und ein ErrorLevel.log wird nicht erstellt.

himitsu 13. Mär 2018 16:39

AW: bcp als batchdatei
 
Eventuell liegt es am SQL? Deine Zahlen sind als String im WHERE? Da kein Fehler kommt, trifft das WHERE wohl einfach nur nichts.
Auch schon ein einfaches
Delphi-Quellcode:
SELECT * FROM irgendwas
versucht?

Im Postgres hatte ich mal das Problem dass das Escapting der Strings in der Console etwas anders gemacht werden musste.
Und grade erst wurden da die Auto-Casts verändert, womit da die Statements auch nicht mehr "wie gewohnt" funktionierten.

Auto-Cast z.b. beim Vergleich von String und Integer oder Strings mit unterschiedlichen Codierungen oder ...

hoika 13. Mär 2018 16:51

AW: bcp als batchdatei
 
Hallo,
also hier wird -S für den Server verwendet

https://social.msdn.microsoft.com/Fo...um=transactsql

TheMemo 13. Mär 2018 17:07

AW: bcp als batchdatei
 
Zitat:

Zitat von himitsu (Beitrag 1395966)
Eventuell liegt es am SQL? Deine Zahlen sind als String im WHERE? Da kein Fehler kommt, trifft das WHERE wohl einfach nur nichts.
Auch schon ein einfaches
Delphi-Quellcode:
SELECT * FROM irgendwas
versucht?

Im Postgres hatte ich mal das Problem dass das Escapting der Strings in der Console etwas anders gemacht werden musste.
Und grade erst wurden da die Auto-Casts verändert, womit da die Statements auch nicht mehr "wie gewohnt" funktionierten.

Auto-Cast z.b. beim Vergleich von String und Integer oder Strings mit unterschiedlichen Codierungen oder ...

Vielen Dank!
Es hat mich auf die richtige Lösung gebracht:

Code:
(FieldInfo.Account LIKE N'001001%%')
Prozentzeichen müssen gedoppelt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz