2017-04-24 1 views
0

J'ai du mal à écrire un script batch. Je l'ai réduit à ce qui semble se briser et je donne un exemple. Le code suivant, lorsque collé dans une console retourne 10 lignes:Pourquoi l'appel sqlcmd suivant renvoie-t-il 0 ligne dans un fichier bat? (passant manuellement)

set TESTRUNID=111222 
set QUERY="select distinct col1 from Table where col2='%TESTRUNID%' and col3 LIKE '%es'" 
start /B /wait sqlcmd -S dahost -U usr -P pwd -Q %QUERY% -o resfile.txt 

Lorsque je l'ai mis dans un script batch, il retourne 0 lignes!

@echo off 
setlocal EnableDelayedExpansion 
REM remark 
REM remark 
set TESTRUNID=111222 
set QUERY="select distinct col1 from Table where col2='%TESTRUNID%' and col3 LIKE '%es'" 
start /B /wait sqlcmd -S dahost -U usr -P pwd -Q %QUERY% -o resfile.txt 
+0

Je ne peux pas répondre à votre question, mais votre clause «WHERE» me semble louche. Je pense qu'il devrait se lire 'wheretranstrunid LIKE '% TESTRUNID%''. Pourquoi une carte d'identité aurait-elle des signes de pourcentage? –

+0

@TimBiegeleisen le %% est pour le moteur de script batch d'analyser TESTRUNID comme la valeur définie dans la ligne ci-dessus – DraxDomax

+0

Qu'en est-il de '% es' - qui n'a qu'un'% ' – doctorlove

Répondre

1

Je pense que vous confondez l'utilisation du signe pour cent à moyenne (1) lot des variables, et (2) caractères génériques SQL. A l'intérieur d'un fichier de commandes, utilisez un double signe %% pour un caractère générique SQL:

set QUERY="select distinct col1 from Table where col2='%TESTRUNID%' and col3 LIKE '%%es'" 

Le signe double% se traduit à un seul signe% avant qu'il ne soit transmis à SQLCMD.

+0

ouais, je l'avais juste compris à partir d'un commentaire que quelqu'un a fait. J'ai essayé votre solution et cela fonctionne bien! Merci! Je suis confus au sujet de ce que je m'échappe ici? le moteur d'analyse sqlcmd ou le moteur d'analyse de script par lots? Si le script batch pense qu'il s'agit d'une variable, il aurait dû essayer de le résoudre (et atteindre null dans ce cas) – DraxDomax

+1

Les scripts batch ont malheureusement des comportements non intuitifs. Quand ils trouvent un seul%, ils l'ignorent. La même commande fonctionnerait correctement avec un seul% si vous aviez tapé sur la ligne de commande. –

+0

Mind = grillé. Merci – DraxDomax