2012-05-03 22 views
11

Estoy tratando de obtener el valor de una sentencia SQL cuando lo ejecuto en un archivo por lotes DOS ...Acceso al valor devuelto de una instrucción SQL en SQLCMD

sqlcmd -E -S DEVSERVER -Q "SELECT COUNT(1) as [CaseCount] FROM Cases" 

No estoy después de la nivel de error como en esta pregunta stackoverflow, más bien estoy después del recuento real devuelto de la base de datos, por lo que puedo hacer algo de lógica adicional.

Respuesta

12

Puede guardar fácilmente el resultado de la ejecución en un archivo de texto, ya sea mediante el indicador -o sqlcmd o mediante el redirector estándar >. A continuación, puede formatear este archivo eliminando el encabezado de columna (marca -h) y eliminando el recuento de filas de SQL Server (SET NOCOUNT ON).

La siguiente secuencia de comandos generará un archivo result.txt con sólo el valor de COUNT(1) y un salto de línea:

SQLCMD -E -S devserver -Q "SET NOCOUNT ON; SELECT COUNT(1) FROM Cases" -h -1 
    > result.txt 

y después lee el valor de nuevo con ...

set /p value=< result.txt 
echo %value% 
+0

+1 acabamos de ver, después de publicar mi respuesta de que sus también incluye el '-h - 1' opción. –

+1

Parcialmente ... ¿cómo recupero el valor en el archivo por lotes de DOS? – SteveC

+1

Entonces quizás la solución @ Christian.K (usando FOR) pueda ser más conveniente para usted, ya que evaluará el resultado del comando y luego podrá asignarle una variable de proceso por lotes, solo tiene que agregar una prueba simple para evitar la cadena vacía. –

12

Usted puede evitar un archivo extra/temporal, llamando al sqlcmd.exe usando el comando por lotes FOR:

for /F usebackq %%i in (`sqlcmd -E -S "devserver,4711" -h-1 -Q "SET NOCOUNT ON; SELECT COUNT(1) ..."`) do (
    set count=%%i 
) 

if not defined count (
    echo Failed to execute SQL statement 1>&2 
) else (
    echo %count% 
) 

Algunas notas:

  • si se llama desde una sesión interactiva CMD.EXE, es decir, la línea de comandos, utilice %i en lugar de %%i
  • La opción -h-1 dice sqlcmd.exe para suprimir los encabezados de columna, por lo que la salida es en realidad sólo una línea de texto.
  • Utilicé un puerto ficticio 4711 con el servidor, para mostrar que necesita poner toda la especificación "servidor, puerto" entre comillas dobles. De lo contrario, debido a las reglas de análisis de línea de comandos de CMD, sqlcmd vería el servidor y el puerto como argumentos distintos y fallaría.
4

La respuesta de @GerardoLima fue el 90% del camino hasta allí. También necesita evaluar el valor de entrada con set /a para quitar el espacio en blanco inicial.

Esto no es necesario con la respuesta de @ Christian.K

SQLCMD -E -S devserver -Q "SET NOCOUNT ON; SELECT COUNT(1) FROM Cases" -h -1 > result.txt 
set /p raw=< result.txt 
echo '%raw%' 
set /a value=%raw% 
echo '%value%' 

Mi salida fue

'   0' 
'0' 
Cuestiones relacionadas