Publicado el :

Prueba Condicional de Restricciones de Tabla SQL

Este código también está disponible en: Deutsch English Français
En espera de validación
El script define la macro `%conditional` que, al ejecutarse, adapta su comportamiento en función de la existencia de la vista `sashelp.vcncolu`. Si esta vista está presente (generalmente indicativa de un entorno que soporta la gestión y la consulta de metadatos de restricciones), la macro crea una tabla `work.example` con una clave primaria compuesta, una restricción única compuesta y una restricción no nula. Luego utiliza `%mp_getconstraints` para extraer estas restricciones y `%mp_assert` para verificar que se devuelven 6 registros de restricciones (el número exacto puede depender de la implementación específica de `mp_getconstraints` para claves compuestas y restricciones múltiples). Si `sashelp.vcncolu` está ausente, la tabla `work.example` se crea sin restricciones, y la prueba valida que la extracción de restricciones devuelve 0 registros, confirmando la ausencia de soporte o visibilidad de las restricciones en ese entorno.
Análisis de datos

Type : MIXTE


El script interactúa con un recurso del sistema (`sashelp.vcncolu`) para su lógica condicional. Crea dinámicamente datos de prueba (`work.example`) y tablas de resultados (`work.constraints`, `work.test_results`) para validar los comportamientos relacionados con las restricciones SQL. No se utilizan datos externos no gestionados por el script.

1 Bloque de código
MACRO
Explicación :
Este bloque define y ejecuta la macro `%conditional`. Utiliza una instrucción `%IF/%THEN/%ELSE` con la función `%SYSFUNC(EXIST())` para verificar la presencia de la vista del sistema `sashelp.vcncolu`. Esta condición determina si la prueba debe evaluar un escenario con restricciones de tabla definidas (si la vista existe) o un escenario sin restricciones (si la vista no existe). La llamada final `%conditional()` activa la ejecución de esta lógica.
¡Copiado!
1%macro conditional();
2 
3%IF %sysfunc(exist(sashelp.vcncolu,view))=1 %THEN %DO;
4 PROC SQL;
5 create TABLE work.example(
6 TX_FROM float FORMAT=datetime19.,
7 DD_TYPE char(16),
8 DD_SOURCE char(2048),
9 DD_SHORTDESC char(256),
10 constraint pk primary key(tx_from, dd_type,dd_source),
11 constraint unq unique(tx_from, dd_type),
12 constraint nnn not null(DD_SHORTDESC)
13 );
14 %mp_assertscope(SNAPSHOT)
15 %mp_getconstraints(lib=work,ds=example,outds=work.constraints)
16 %mp_assertscope(COMPARE)
17 
18 %mp_assert(
19 iftrue=(%mf_nobs(work.constraints)=6),
20 desc=OUTPUT TABLE work.constraints created with correct number of records,
21 outds=work.test_results
22 )
23%END;
24%ELSE %DO;
25 PROC SQL;
26 create TABLE work.example(
27 TX_FROM float FORMAT=datetime19.,
28 DD_TYPE char(16),
29 DD_SOURCE char(2048),
30 DD_SHORTDESC char(256)
31 );
32 %mp_assertscope(SNAPSHOT)
33 %mp_getconstraints(lib=work,ds=example,outds=work.constraints)
34 %mp_assertscope(COMPARE)
35 
36 %mp_assert(
37 iftrue=(%mf_nobs(work.constraints)=0),
38 desc=Empty TABLE created as constraints not supported,
39 outds=work.test_results
40 )
41%END;
42%mend conditional;
43 
44%conditional()
2 Bloque de código
PROC SQL Data
Explicación :
Este bloque de código se ejecuta cuando se detecta la vista `sashelp.vcncolu`. Utiliza `PROC SQL` para crear la tabla `work.example` con las columnas `TX_FROM`, `DD_TYPE`, `DD_SOURCE`, `DD_SHORTDESC`, y aplica tres restricciones: una clave primaria compuesta (`pk`), una clave única compuesta (`unq`), y una restricción no nula (`nnn`). Luego, las macros `%mp_assertscope(SNAPSHOT)` y `%mp_assertscope(COMPARE)` definen un contexto de prueba. Se llama a `%mp_getconstraints` para extraer todas las restricciones de `work.example` en la tabla `work.constraints`. Finalmente, `%mp_assert` verifica que la tabla `work.constraints` contiene exactamente 6 registros, validando así la detección correcta de las restricciones en este entorno.
¡Copiado!
1PROC SQL;
2 create TABLE work.example(
3 TX_FROM float FORMAT=datetime19.,
4 DD_TYPE char(16),
5 DD_SOURCE char(2048),
6 DD_SHORTDESC char(256),
7 constraint pk primary key(tx_from, dd_type,dd_source),
8 constraint unq unique(tx_from, dd_type),
9 constraint nnn not null(DD_SHORTDESC)
10 );
11 %mp_assertscope(SNAPSHOT)
12 %mp_getconstraints(lib=work,ds=example,outds=work.constraints)
13 %mp_assertscope(COMPARE)
14 
15 %mp_assert(
16 iftrue=(%mf_nobs(work.constraints)=6),
17 desc=OUTPUT TABLE work.constraints created with correct number of records,
18 outds=work.test_results
19 )
3 Bloque de código
PROC SQL Data
Explicación :
Este bloque de código se ejecuta cuando no se detecta la vista `sashelp.vcncolu`. Crea la tabla `work.example` utilizando `PROC SQL` pero sin ninguna restricción explícita. Al igual que en el caso anterior, las macros `%mp_assertscope(SNAPSHOT)` y `%mp_assertscope(COMPARE)` establecen el contexto de prueba, y `%mp_getconstraints` intenta extraer las restricciones. La aserción final `%mp_assert` valida que la tabla `work.constraints` está vacía (0 registros), confirmando que no se detectan ni se admiten restricciones en este entorno, lo cual es el comportamiento esperado en este escenario.
¡Copiado!
1PROC SQL;
2 create TABLE work.example(
3 TX_FROM float FORMAT=datetime19.,
4 DD_TYPE char(16),
5 DD_SOURCE char(2048),
6 DD_SHORTDESC char(256)
7 );
8 %mp_assertscope(SNAPSHOT)
9 %mp_getconstraints(lib=work,ds=example,outds=work.constraints)
10 %mp_assertscope(COMPARE)
11 
12 %mp_assert(
13 iftrue=(%mf_nobs(work.constraints)=0),
14 desc=Empty TABLE created as constraints not supported,
15 outds=work.test_results
16 )
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.
Información de copyright : El código utiliza macros (`%mp_assert`, `%mp_getconstraints`, `%mf_nobs`, `%mp_assertscope`) que forman parte del framework SASUnit. El archivo referenciado `macro_without_brief_tag.sas` indica un copyright 'Copyright 2010-2023 HMS Analytical Software GmbH', el editor de SASUnit.