2012-10-27 19 views
5

Sono in grado di connettersi a un'istanza di Microsoft SQL Server 2008 tramite una VM Linux di Mint utilizzando freeTSD e riga di comando per eseguire istruzioni SQL su di esso. Ora voglio automatizzarlo in uno script bash. Sono in grado di effettuare il login con successo nel mio script bash:bash FreeTDS: esecuzione di query SQL in server Microsoft SQL

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

Ho poi ho la mia query SQL:

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 

Questo funziona quando si fa manualmente tramite linea di comando freeTSD, ma non quando ho messo nel file di bash . Ho seguito questo post: freeTSD & bash.

Ecco il mio bash script di esempio:

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 

l'output dello script bash è:

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> 

e poi viene eseguito il resto del mio script.

Qualcuno può darmi una risposta graduale al mio problema?

+0

corretti alcuni problemi di collegamento ipertestuale :) –

risposta

3

Non sono sicuro di come il tuo campione possa funzionare.

Ecco il mio esempio di script bash:

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

Provare a utilizzare un ';' char.

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

Meglio ancora, utilizzare "documenti qui" della shell.

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.

attuale ingresso di linea di comando:

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

ottieni "USE dbname ... come output"? Ho modificato come hai detto includendo '\ r \ n' mentre sto usando syshing con cygwin. Ottengo un risultato di: '>' che sembra un tipo di prompt, non è il freeTDS dato che di solito ha un '#' aggiunto e accetta i comandi sql ... echo "cancella dalla tabella dove userid> 5 \ r \ n vai \ r \ n cancella dalla tabella dove userid> 5 \ r \ n vai \ r \ n cancella dalla tabella dove ID> 5 \ r \ n GO \ r \ n exit \ r \ n "

+0

Vedi le modifiche, mi dispiace. Ma No, non in uscita, viene immesso in tsql tramite la shell qui documenti. Spiacente, ma è possibile leggere il resto del tuo commento, puoi aggiornare la tua domanda? (Lasciando per il giorno, potrebbe essere in grado di guardare la tua risposta da casa, ma più probabilmente non fino a domani.) Buona fortuna. – shellter

+0

Ho modificato, qualche idea? @ Sheller –

0

provare

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" 

il resto di questa stringa è roba che funziona forse

e provare

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" 

e provare

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

se si utilizza ODBC, raccomando il secondo tr ial. se si inviano comandi a sql con una parola "go" come separatore di frasi SQL, forse il primo è migliore. forse il terzo ... chissà ... solo prove ed errori possono dire ...

+0

nessuno di questi ha lavorato, penso che il problema è che io è necessario imitare il tasto 'invio' in freeTDS in modo che il comando venga eseguito, o il delimitatore corretto per passare alla riga successiva ... –

+0

@ebel: "imita la chiave di invio", dici che stai usando bash, ogni possibilità che stai usando bash in un ambiente Windows (forse anche Cygwin?). Prova a cambiare "\ n" sopra in "\ r \ n". In bocca al lupo. – shellter

2

thread vecchio, ma questo sembrava funzionare ..

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) 
Problemi correlati