2012-10-27 4 views
5

Je peux me connecter à une instance Microsoft SQL Server 2008 via une machine virtuelle Mint Linux en utilisant freeTSD et la ligne de commande pour exécuter des instructions SQL. Maintenant, je veux l'automatiser dans un script bash. Je suis capable de se connecter avec succès dans mon script bash:freeTDS bash: Exécution de requêtes SQL dans Microsoft SQL Server

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

J'ai alors ma requête 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 

Cela fonctionne lorsque vous faites manuellement via la ligne de commande freeTSD, mais pas quand je mets dans le fichier bash . J'ai suivi ce post: freeTSD & bash.

Voici mon exemple de script 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 

la sortie du script bash est:

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> 

puis le reste de mon script est exécuté.

Quelqu'un peut-il me donner une réponse étape par étape à mon problème?

+0

a corrigé quelques problèmes de liens hypertextes :) –

Répondre

3

Je ne sais pas comment votre échantillon peut fonctionner du tout.

Voici mon exemple de 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? 

Essayez d'utiliser un ';' carboniser.

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

Mieux encore, utilisez le shell "ici documents".

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.

entrée de ligne de commande actuelle:

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

vous obtenez ce "USE dbname ... comme une sortie"? J'ai modifié comme vous l'avez dit y compris '\ r \ n' comme je suis en train de sshing en utilisant cygwin. J'obtiens un résultat de: '>' qui ressemble à un type d'invite, ce n'est pas le freeTDS car il a généralement un '#' ajouté et accepte les commandes sql ... echo "delete from table where userid> 5 \ r \ n go \ r \ n supprimer de la table où userid> 5 \ r \ n go \ r \ n supprimer de la table où ID> 5 \ r \ n GO \ r \ n quitter \ r \ n "

+0

Voir les modifications, désolé. Mais non, pas de sortie, il est entré dans tsql via shell ici les documents. Désolé, mais je ne peux pas lire le reste de votre commentaire, pouvez-vous mettre à jour votre question à la place? (Laissant pour la journée, peut être en mesure de regarder votre réponse de la maison, mais plus probablement pas avant demain.) Bonne chance. – shellter

+0

J'ai modifié, des idées? @Shellter –

0

essayer

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" 

le reste de cette chaîne est une chose qui fonctionne peut-être

et essayer

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" 

et essayer

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

si vous utilisez odbc, je recommande le deuxième tr ial. si vous envoyez des commandes à sql avec un mot "go" en tant que séparateur de phrases sql, peut-être que le premier est meilleur. peut-être le troisième ... qui sait ... seulement essais et erreurs peuvent dire ...

+0

aucun de ces travaillé, je pense que le problème est que je besoin d'imiter la touche 'entrée' dans freeTDS afin que la commande soit exececute, ou le délimiteur correct pour aller à la ligne suivante ... –

+0

@ebel: "mimic enter key", vous dites que vous utilisez bash, une chance que vous utilisiez bash dans un environnement Windows (peut-être même Cygwin?). Essayez de remplacer "\ n" s par "\ r \ n". Bonne chance. – shellter

2

fil vieux mais cela semblait fonctionner ..

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)