Pregunta
· 19 sep, 2022

how to execute a multiple sql statement from a bat file

hi, my apologises for my english and my level . //al final en castellano

first i am having problem executing in terminal with $SYSTEM.SQL.Shell() when i work with the << entering multiline statement mode >>

i ve tried this ...

SAMPLES>DO $SYSTEM.SQL.Shell()
SQL Command Line Shell
----------------------------------------------------
 
The command prefix is currently set to: <<nothing>>.
Enter q to quit, ? for help.
SAMPLES>>  << entering multiline statement mode >>         //i press <enter>
        1>>UPDATE Cinema.Film SET "Description" = 'D1' WHERE "ID" = 1 GO
        2>>UPDATE Cinema.Film SET "Description" = 'D2' WHERE "ID" = 2 GO
        3>>UPDATE Cinema.Film SET "Description" = 'D3' WHERE "ID" = 3 GO
        4>>q
SAMPLES>>

... but nothing happens. meanwhile in 'single statement' works

SAMPLES>>UPDATE Cinema.Film SET "Description" = 'D1' WHERE "ID" = 1
7.      UPDATE Cinema.Film SET "Description" = 'D1' WHERE "ID" = 1
 
1 Row Affected
statement prepare time(s)/globals/lines/disk: 0.0003s/11/131/0ms
          execute time(s)/globals/lines/disk: 0.0003s/18/253/0ms
                          cached query class: %sqlcq.SAMPLES.cls5
---------------------------------------------------------------------------
SAMPLES>>

... really i dont know how to execute several UPDATEs  in the same SQL query. i ve trying this before mounting all the commands to be executed from a batch file. my goal is to launch a .bat file that execute an sql UPDATE for several lines. this several updates are generated from an excel macro and stored in TXT file. i suppose can generate only sql lines in the txt or whole lines to execute in terminal cursor. i dont know what is better.

i know they are 2 troubles in 1 , but first i need to check that sql updates in CTERM they works, and then how to mount the bat file in the local host. 

thanks in advance.

lo dicho pues. que por un lado no consigo ejecutar varias instrucciones en una sola sentencia, varios UPDATEs en el modo 'multi-linea que deja elegir el shell() y por otro que no se si seria posible lanzar un bat para que ejecute un sql con el terminal, o bien con todas las lineas o dirigiendose a un fichero .txt que incluya el sql a ejecytar.

 gracias.

Product version: Caché 2018.1
Comentarios (7)1
Inicie sesión o regístrese para continuar

No sé si entendí bien tu pregunta, pero creo que si quieres ejecutar a todos los comandos en el SQL Shell puedes hacer

SAMPLES>>  << entering multiline statement mode >>         //i press <enter>
        1>>UPDATE Cinema.Film SET "Description" = 'D1' WHERE "ID" = 1 
        2>>UPDATE Cinema.Film SET "Description" = 'D2' WHERE "ID" = 2 
        3>>UPDATE Cinema.Film SET "Description" = 'D3' WHERE "ID" = 3 
        4>>GO
 

espero que eso poquito te puedas ayudar en algo jaja

muchas gracias por la ayuda pero sigo con error:

puede ser que sea un tema de comillas o algo asi?

SAMPLES>>  << entering multiline statement mode >>
        1>>UPDATE Cinema.Film SET "Description" = 'D1' WHERE "ID" = 1
        2>>UPDATE Cinema.Film SET "Description" = 'D2' WHERE "ID" = 2
        3>>UPDATE Cinema.Film SET "Description" = 'D3' WHERE "ID" = 3
        4>>GO
 
ERROR #5540: SQLCODE: Mensaje -25:  Entrada (UPDATE) encontrada al finalizar la consulta ^ UPDATE Cinema . Film SET "Description" = ? WHERE "ID" = ? UPDATE
SAMPLES>>

Hola de nuevo!

Hice algunas pruebas y investigue un poco:

 - el UPDATE con el "GO" en la misma línea no funciona, hay que hacer 

1>> UPDATE ...

2>> GO

Pero eso tampoco funciona con muchos UPDATES porque no se puede hacer muchos updates de una sola vez. 

La mejor solución que encontré fue hacer un loop, algo como

declare @COUNT int = 1

declare @FIRSTVALUE VARCHAR(2) = 'a'

declare @SECONDVALUE VARCHAR(2)

declare @sql VARCHAR(max)

BEGIN

WHILE @COUNT < 4

SET @SECONDVALUE = @FIRSTVALUE_@COUNT

SET @sql = 'UPDATE Cinema.Film SET "Description" = '_@SECONDVALUE_' WHERE "ID" = '_@COUNT'

EXEC(@sql)

SET @COUNT = @COUNT + 1

END

Creo que no se puede declarar algo que no sea un cursor en el SQL Shell, pero si logras hacerlo en una file puede ser que funciona jaja no sé, creo que no pude darte las respuestas, perdón por eso, pero espero que algo nuevo te ocurra de lo que dije! 

PS.: Creo que tus descripciones no son realmente "D1", D2", "D3" jaja pero ojalá algo asi te ayude!

PPS.: acá sigue el ejemplo que seguí: https://pt.stackoverflow.com/questions/161416/como-fazer-for-loop-em-sql...

al final acabo por responderme yo mismo...  son las COMILLLAS

SAMPLES>>  << entering multiline statement mode >>
        1>>UPDATE Cinema.Film SET Description = 'D1' WHERE ID = 1
        2>>GO
1.      UPDATE Cinema.Film SET Description = 'D1' WHERE ID = 1
 
1 Row Affected
statement prepare time(s)/globals/lines/disk: 0.0144s/2605/41887/0ms
          execute time(s)/globals/lines/disk: 0.0004s/24/246/0ms
                          cached query class: %sqlcq.SAMPLES.cls25
---------------------------------------------------------------------------

por lo tanto,  la parte de edicion del sql y ejecucion creo que esta resuelta. el tema es, puedo lanzar desde el shell la ejecucion de un archivo que contenga el SQL , o debo hacer un script que ejecute linea por linea las instrucciones sql que tengo en txt ????

Puedes usar desde un terminal:

do $SYSTEM.SQL.Shell() y la funccion siguiente: [o help para ver todas las opciones]

run [<filename>]      Run an SQL script. If <filename> is not specified then
                         the user will be prompted for the file name.

Tambien, existe la funccion:

do $SYSTEM.SQL.Help() para ver las funciones de Importacion de SQL/DDL:

$SYSTEM.SQL.MSSQLServer()
$SYSTEM.SQL.Oracle()
$SYSTEM.SQL.ImportDir()
Nota: algunas de estas funciones estan "obsoletas" en IRIS, pero las encontraras en Cacheé 2018.
 

q