2012-10-27 9 views
5

Ich bin in der Lage, eine Verbindung zu einer Microsoft SQL Server 2008-Instanz über eine Mint Linux VM mit freeTSD und Befehlszeile zu SQL-Anweisungen ausführen. Jetzt möchte ich das in einem Bash-Skript automatisieren. Ich bin in der Lage, erfolgreich in meinem Bash-Skript anmelden:freeTDS bash: Ausführen von SQL-Abfragen in Microsoft SQL Server

TDSVER=8.0 tsql -H servername -p 1433 -D dbadmin -U domain\\Administrator -P password 

Ich habe dann meine SQL-Abfrage:

USE dbname GO delete from schema.tableA where ID > 5 GO delete from schema.tableB where ID > 5 GO delete from schema.tableC where ID > 5 GO exit 

Dies funktioniert, wenn sie manuell über freeTSD Befehlszeilen zu tun, aber nicht, wenn ich legte in bash-Datei . Ich folgte diesem Beitrag: freeTSD & bash.

Hier ist meine Bash-Skript Beispiel:

echo "USE dbname GO delete from schema.tableA where userid > 5 go delete from schema.tableB where userid > 5 go delete from schema.tableC where ID > 5 GO exit" > tempfile | TDSVER=8.0 tsql -H servername -p 1433 -D dbname -U domain\\Administrator -P password < tempfile 

die Ausgabe des Bash-Skript ist:

locale is "en_US.UTF-8" 
locale charset is "UTF-8" 
Default database being set to sbdb 
1> 2> 3> 4> 5> 6> 7> 8> 

und dann für den Rest meines Skript ausgeführt wird.

Kann mir jemand eine Schritt für Schritt Antwort auf mein Problem geben?

+0

einige Hyperlink Probleme :) –

Antwort

3

Ich bin mir nicht sicher, wie Ihre Probe überhaupt funktionieren kann.

Hier ist meine Bash-Skript Beispiel:

echo "USE dbname .... exit" > tempfile | TDSVER=8.0 tsql -H servername -p 1433 -D dbname -U domain\\Administrator -P password < tempfile 
# ------------------------------------^^^^ ---- pipe char? 

versuchen, eine mit ';' verkohlen.

echo "USE dbname .... exit" > tempfile ; TDSVER=8.0 tsql -H servername -p 1433 -D dbname -U domain\\Administrator -P password < tempfile 
# ------------------------------------^^^^ ---- semi-colon 

Besser noch, verwenden Sie Shells "hier Dokumente".

TDSVER=8.0 tsql -H servername -p 1433 -D dbname -U domain\\Administrator -P password <<EOS 
    USE dbname 
    GO 
    delete from schema.tableA where userid > 5 
    go 
    delete from schema.tableB where userid > 5 
    go 
    delete from schema.tableC where ID > 5 
    GO 
    exit 
    EOS 

IHTH.

Aktuelle Kommandozeileneingabe:

echo "delete from table where userid > 5 
go 
delete from table where userid > 5 
go 
delete from table where ID > 5 
GO 
exit" < /tmp/tempfile; TDSDUMP=/tmp/freetds.log TDSVER=8.0 tsql -H servername -p 1433 -D dbname -U Administrator -P password <<EOS 
+0

Sie erhalten, dass "USE dbname ... als Ausgabe"? Ich habe modifiziert, wie du sagtest, einschließlich '\ r \ n', wie ich mit Cygwin sshing bin. Ich bekomme ein Ergebnis von: '>', das wie eine Art von Eingabeaufforderung aussieht, es ist nicht die freeTDS, da es normalerweise ein '#' angehängt hat und sql-Befehle akzeptiert ... echo "delete from table wo userid> 5 \ r \ n go \ r \ n delete aus der Tabelle wo userid> 5 \ r \ n go \ r \ n aus der Tabelle löschen, wo ID> 5 \ r \ n GO \ r \ n exit \ r \ n "

+0

Siehe Änderungen, sorry. Aber Nein, nicht ausgegeben, es ist Eingabe in Tsql über Shell hier Dokumente. Entschuldigung, aber es ist möglich, den Rest Ihres Kommentars zu lesen. Können Sie stattdessen Ihre Frage aktualisieren? (Für den Tag zu verlassen, kann in der Lage sein, Ihre Antwort von zu Hause aus zu sehen, aber wahrscheinlich nicht bis morgen.) GOod Glück. – shellter

+0

Ich modifizierte, irgendwelche Ideen? @Shellter –

0

versuchen

echo "USE dbname\n GO\n delete from schema.tableA where ID > 5\n GO\n delete from schema.tableB userid > 5\n go\n delete from schema.tableC where ID > 5\n GO\n exit\n" 

der Rest dieser Zeichenfolge Sachen, die vielleicht

und versuchen

echo "USE dbname;\n delete from schema.tableA where ID > 5;\n delete from schema.tableB userid > 5;\n delete from schema.tableC where ID > 5;\n exit\n" 

und versuchen

echo "USE dbname; delete from schema.tableA where ID > 5; delete from schema.tableB userid > 5; delete from schema.tableC where ID > 5; exit" 

wenn Sie odbc verwenden funktioniert, Ich empfehle den zweiten tr ial. Wenn Sie Befehle an sql mit einem "go" Wort als SQL-Satz-Trennzeichen senden, ist vielleicht die erste besser. vielleicht der dritte ... wer weiß ... nur Versuch und Irrtum kann sagen ...

+0

keines dieser arbeitete fixiert, ich denke, das Problem ist, dass ich muss den 'Enter'-Schlüssel in freeTDS nachahmen, damit der Befehl exceecute wird, oder das korrekte Trennzeichen für die nächste Zeile ... –

+0

@ebel: "mimic enter key", Sie sagen, Sie verwenden bash, jede Chance, die Sie Bash in einer Windows-Umgebung verwenden (vielleicht sogar Cygwin?). Versuchen Sie, "\ n" s oben in "\ r \ n" zu ändern. Viel Glück. – shellter

2

Alt Faden, aber diese Arbeit schien ..

printf "use mydbname\ngo\nselect * from mytable\ngo\nexit\n"|tsql -I freetds.conf -S profileName -U user -P 'password' 

1> 2> 1> 2> ID stringtest integertest 
1 test 50 
2 teststring2 60 
3 test3 70 
(3 rows affected) 
Verwandte Themen