Hay ocasiones en las que lanzamos consultas a las BBDD con SAS y necesitamos saber si son correctas. Quería plantearos un truco SAS para PROC SQL que valida las consultas antes de ser ejecutadas. Empiezo el truco en la línea habitual, creo un dataset de ejemplo y os presento como realizar la validación, de este modo vosotros podéis copiar y pegar el código en una sesión de SAS y comprobar su funcionamiento. Datos aleatorios de partida:
data datos;
array importe(5);
drop j;
do id_cliente=1 to 10000;
do j=1 to 5;
importe(j) = rand("uniform")*10000;
end;
output;
end;
run;
10.000 observaciones y 6 variables. Hemos de realizar una consulta sobre esta tabla y primero hemos de validarla, uno de los medios para realizar esta tarea es la opción NOEXEC dentro de PROC SQL:
proc sql noexec;
create table datos1 as select
id_cliente,
importe1,
importe2
fron datos
where importe6 >= 5000;
quit;
NOEXEC no ha ejecutado la consulta y nos devuelve un error, está escrito fron en vez de from. Pero NO HAY QUE EMPLEAR PARA VALIDAR LA OPCIÓN NOEXEC, lo demuestro con el siguiente código:
proc sql noexec;
create table datos1 as select
id_cliente,
importe1,
importe2
from datos
where importe6 >= 5000;
quit;
Aparentemente la consulta no tiene ningún error. Sin embargo en la cláusula where tenemos importe6, una variable que no existe. Es decir, NOEXEC sólo nos ha validado la sintaxis, no la consulta. Así pues nos olvidamos de NOEXEC. Para realizar validaciones emplearemos la sentencia VALIDATE:
proc sql ;
validate
/*create table datos1 as*/ select
id_cliente,
importe1,
importe2
from datos
where importe6 >= 5000;
quit;
VALIDATE siempre precede a SELECT y no sólo nos valida la sintaxis de nuestra consulta sino que además nos valida los campos que incluimos en ella. En el ejemplo que os he puesto lo que hacemos es comentar CREATE TABLE y poner VALIDATE. Así podemos dejar lanzadas consultas a servidores en horario de menor concurrencia con la seguridad de que la ejecución es correcta, algo que puede provocar cierta inquietud. Saludos.
Muy interesante… habrá que tenerlo en cuenta para futuros códigos. Gracias!
Interesante. Lo tendré en cuenta a la hora de hacer pruebas….
Raul, tengo una consulta, y este es el tema mas parecido que he encontrado.
Realizo una connexion desde codigo SAS con bases de datos DB2, con un codigo como el siguiente:
LIBNAME MYDB2 DB2 SSID=»DBXX» AUTHID=»YYYYYYY»;
DATA TMP;
SET MYDB2.BD1;
WHERE VAR1 EQ 1;
RUN;
PROC PRINT DATA=TMP;QUIT;
lo que me interesaria es obtener el valor SQLCODE para poder realizar despues algunas acciones dependiendo de este.
Por ejemplo, al ejecutar el codigo anterior, me da un 904, a partir de ese 904, no realizar la siguiente acciones y enviar un mensaje.
Gracias de antemano y enhorabuena por esta pagina que tan bien va para quienes aprendemos cosas sobre SAS.
Hola Alejandro. Ahora mismo desconozco las opciones adecuadas en LIBNAME para que te muestre el error. Pero a lo mejor puedes utilizar PASS THRU:
https://analisisydecision.es/oracle-y-sas-via-sql-pass-trough/
El ejemplo que pongo hace referencia a Oracle, pero prueba a utilizar el motor de DB2, la instrucción %put &sqlxmsg; lo que hace el devolver los mensajes del servidor.
Perdón por no aportar mucho, pero ahora estoy lejos de un entorno de SAS.
no sirbe para nada
dberias explicarlo mejor