2012-10-27 9 views
5

Mogę połączyć się z wystąpieniem Microsoft SQL Server 2008 za pośrednictwem maszyny wirtualnej Mint Linux przy użyciu freeTSD i linii poleceń, aby wykonać na nim instrukcje sql. Teraz chcę zautomatyzować to w skrypcie basha. Jestem w stanie pomyślnie zalogować się w moim skrypcie bash:bash freeTDS: Wykonywanie kwerend sql w serwerze Microsoft SQL

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

I wtedy moje zapytanie 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 

To działa, gdy robi ręcznie poprzez linię poleceń freeTSD, ale nie wtedy, kiedy mogę umieścić w pliku bash . Śledziłem ten wpis: freeTSD & bash.

Oto mój przykładowy skrypt bash:

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 

wyjście skryptu 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> 

a następnie reszta mojego skryptu jest wykonywany.

Czy ktoś może dać mi krok po kroku odpowiedź na mój problem?

+0

ustalone pewne problemy hiperłączy :) –

Odpowiedz

3

Nie jestem pewien, jak twoja próbka może w ogóle działać.

Oto mój przykładowy skrypt bash:

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

Spróbuj użyć ';' zwęglać.

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

Jeszcze lepiej, użyj "tutaj dokumentów" powłoki.

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.

Wejście prądowe linii komend:

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

otrzymujesz "USE dbname ... jako wynik"? Zmodyfikowałem, jak powiedziałeś, włączając '\ r \ n', ponieważ używam cygwin. Otrzymuję wynik: '>', który wygląda jak jakiś typ zachęty, nie jest to freeTDS, ponieważ zwykle ma '#' dołączone i akceptuje polecenia sql ... echo "usuń z tabeli, gdzie id_użytkownika> 5 \ r \ n idź \ r \ n usuń z tabeli, gdzie id_użytkownika> 5 \ r \ n idź \ r \ n usuń z tabeli, gdzie ID> 5 \ r \ n GO \ r \ n exit \ r \ n "

+0

Zobacz zmiany, przepraszam. Ale nie, nie dane wyjściowe, to dane wejściowe do tsql za pośrednictwem powłoki tutaj dokumentów. Przepraszam, ale czy możesz przeczytać resztę swojego komentarza, czy zamiast tego możesz zaktualizować swoje pytanie? (Wyjście na jeden dzień, może być w stanie spojrzeć na twoją odpowiedź z domu, ale raczej nie do jutra). Powodzenia. – shellter

+0

Ja zmodyfikowałem, jakieś pomysły? @Shellter –

0

spróbować

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" 

reszta tego łańcucha jest rzeczy, które być może działa

i spróbuj

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" 

i spróbuj

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

jeśli używasz ODBC, polecam drugi tr i inni. jeśli wysyłasz komendy do sql ze słowem "go" jako separatorem zdań sql, może ten pierwszy jest lepszy. może trzecia ... kto wie ... tylko próba i błąd mogą powiedzieć ...

+0

żaden z nich pracował, myślę, że problem jest, że potrzebować naśladować klawisz "enter" w freeTDS, aby polecenie zostało wykonane, lub właściwy ogranicznik, aby przejść do następnego wiersza ... –

+0

@ebel: "mimic enter key", mówisz, że używasz bash, jakakolwiek szansa, że ​​używasz bash w środowisku Windows (może nawet Cygwin?). Spróbuj zmienić "\ n" s powyżej na "\ r \ n". Powodzenia. – shellter

2

stary wątek, ale to wydawało się do pracy ..

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)