Filtrado de tipos de datos de Sybase BIT

dapper sql sybase sybase-ase

Pregunta

Estamos utilizando Sybase ASE para una aplicación que estamos desarrollando desde cero. Tenemos tablas que tienen columnas de bits. En Sybase, los tipos de datos Bit no pueden ser nulos. Esto está bien para los registros que estamos almacenando en las tablas, pero tenemos un problema de diseño para nuestros procedimientos almacenados de BÚSQUEDA. Confiamos mucho en los generadores de código para nuestros procedimientos almacenados y las clases de capa de acceso a datos correspondientes (en .NET usando Dapper). Como no podemos pasar NULL para los parámetros de Bit a nuestros procedimientos almacenados de BÚSQUEDA, solo podemos recuperar registros con 1 o 0 valores en las columnas de Bit. Ejemplo a continuación:

Table1
Column1 INT NULL,
Column2 BIT

SPROC1
@Column1 INT NULL,
@Column2 BIT

SELECT
Column1,
Column2
FROM
Table1
WHERE
Column1 = ISNULL(@Column1, Column1) AND
Column2 = ISNULL(@Column2, Column2) --since @Column2 contains either 1 or 0, this search sproc cannot return both

Hay soluciones para esto, como introducir otro parámetro BIT para denotar si se salta la coincidencia de la columna de bit, pero como escribimos y mantenemos los generadores de código de procedimiento almacenado, queremos mantener los procedimientos almacenados lo más simple posible. Sin mencionar que esto tiene que hacerse para cada columna / parámetro. Otra forma es, por supuesto, cambiar el tipo de datos bit a tinyint. Pero, ¿es este un diseño válido / bueno? No parece ser una buena práctica para mí, pero eso debería solucionar todos nuestros problemas con los bits de Sybase. Podemos crear un tipo de datos minúsculo que sea nulo y que permita solo 0 y 1. Si cambiamos a tinyint, no tendremos más remedio que cambiar las propiedades booleanas de nuestras clases de acceso a datos a int16 (estoy de acuerdo con esto, solo para evitar el problema de los bits).

¿Algún consejo?

Respuesta popular

Basado en el generador anterior, pasar nulos significa que no se filtra según esa columna. Si puede modificar el código del generador, verifique la solución a continuación:

En Sybase, tipo de datos de bit, acepta los valores distintos de 0 y 1, pero siempre se interpretan como 1.

El proceso almacenado puede invocarse pasando (-1) o pasando (3); cuando uno intenta no filtrar en función de esa columna. Y el código del generador se puede actualizar para producir el siguiente SQL sobre la marcha:

SELECT
Column1,
Column2
FROM
Table1
WHERE
Column1 = ISNULL(@Column1, Column1) AND
( Column2 = ISNULL(@Column2, Column2) or ( @column2 not in (1,0) ) )
Column3 = ISNULL(@Column3, Column3) AND 
.....


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow