2010-02-24 8 views
3

Est-il possible de récupérer le jeu de résultats d'une requête sql dans une variable locale; la requête doit être exécutée dans un fichier batch. Ce que j'essaye de faire est quelque chose comme ceci:Comment définir une variable locale pour le résultat de la requête sql dans un fichier batch?

set varname = osql -S%dstserver% -d%dstDB% -Q"SELECT name from table_name where Id = %siteId%" %osqluser% -b 

varname est ma variable locale.

Je suis tout à fait nouveau dans sql de sorte que toute aide serait grandement appreciated1

Répondre

2

Ecrire le résultat au fichier, puis lire le fichier. Dans votre cas, vous devez lire la première ligne (et éventuellement trim).

Ajouter des paramètres suivants à votre requête:

osql -S%dstserver% -d%dstDB% -Q"SET NOCOUNT ON;SELECT name from table_name where Id = %siteId%" %osqluser% -b -w 9999 -h-1 -o tempres.txt 
  • -o ...: fichier de sortie (que vous devez lire plus tard)
  • -h-1: en-tête désactiver
  • - w 9999: pour s'assurer qu'il gère correctement les cas lorsque votre name est plus longue que la valeur par défaut 80 caractères
  • SET NOCOUNT ON; avant réelle requête pour désactiver la chaîne d'état comme (1 row affected)
0

Vous pouvez écrire le résultat dans un fichier contenant des déclarations set. Le résultat 42 est écrit à l'écran. Pour sélectionner un nom d'une table, utilisez une instruction SQL comme:

select 'set var=' + name from table_name where Id = %siteId% 
1

Vous pouvez utiliser for /f itérer sur la sortie d'une commande:

for /f "usebackq delims=" %%x in (`your command`) do ... 

Vous n'avez pas besoin d'un fichier temporaire tout; cela ne vous rapportera rien (sauf devoir penser à l'endroit où vous pourriez avoir des permissions d'écriture et n'oubliez pas de supprimer le fichier par la suite).

for effectue une répétition ligne par ligne sur la sortie, en effectuant une segmentation au fur et à mesure. C'est pourquoi il y a un delims= à la fin qui désactive effectivement tout tokenizing afin que vous n'obteniez pas votre production divisée aux espaces. Il existe d'autres options, telles que skip=n qui ignore les lignes n avant de commencer le traitement que vous pouvez utiliser pour ignorer un en-tête.

A l'intérieur de cette boucle, vous pouvez alors effectuer les opérations suivantes:

for /f "usebackq delims=" %%x in (`your command`) do set VAR=%%x 

Soyez très prudent ce que vous faites ensuite avec cette variable, cependant, car il peut contenir des caractères les traite de coquille comme spéciale, comme >, < , &, etc.Vous pouvez vous créer ici une sorte de lot vulnérabilité d'injection lorsque vous faites quelque chose comme ce qui suit:

echo %VAR% 

et que quelqu'un décide de mettre la chaîne suivante en son nom:

foo & rd /s q \ 

Si vous savez que seulement seule ligne avec des rendements de contenu utilisables et le reste est inutile indésirable alors vous pouvez briser la boucle prématurément:

for /f "usebackq delims=" %%x in (`your command`) do set VAR=%%x&goto break 
:break 
1

utilisation set /p:

osql -S%dstserver% -d%dstDB% -Q"SET NOCOUNT ON;SELECT name from table_name where Id = %siteId%" %osqluser% -b -w 9999 -h-1 -o tempres.txt 

set /p varname=<tempres.txt 

(emprunt osql paramètres de van's réponse)

+0

+1: agréable, bien que lit une seule ligne, mais cela suffit pour cette question. – van

Questions connexes