Nous utilisons Sybase ASE pour une application que nous développons à partir de rien. Nous avons des tables qui ont des colonnes Bit. Dans Sybase, les types de données Bit ne peuvent pas être null. C'est bien pour les enregistrements que nous stockons dans les tables, mais nous avons un problème de conception pour nos procédures stockées SEARCH. Nous comptons beaucoup sur les générateurs de code pour nos procédures stockées et les classes de couche d'accès aux données correspondantes (dans .NET en utilisant Dapper). Comme nous ne sommes pas en mesure de transmettre NULL pour les paramètres Bit à nos procédures stockées SEARCH, nous ne pouvons récupérer que des enregistrements avec des valeurs 1 ou 0 dans les colonnes Bit. Exemple ci-dessous:
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
Il existe des solutions à ce problème, par exemple en introduisant un autre paramètre BIT pour indiquer si la colonne de bits doit être ignorée, mais comme nous écrivons et gérons les générateurs de code de procédure stockée, nous voulons garder les procédures stockées aussi simples que possible. Sans compter que cela doit être fait pour chaque colonne / paramètre de bit. Une autre façon est bien sûr de changer le type de données bit en tinyint. Mais est-ce un design valide / bon? Cela ne semble pas être une bonne pratique pour moi, mais cela devrait résoudre tous nos problèmes de bits Sybase. Nous pouvons créer un type de données custode tinyint qui est nullable et ne devrait autoriser que 0 et 1. Si nous passons à tinyint, nous n'aurons pas d'autre choix que de changer les propriétés booléennes de nos classes d'accès aux données en int16 pour contourner le problème des bits).
Aucun conseil?
Basé sur le générateur ci-dessus, le passage de null ne filtre pas en fonction de cette colonne. Si vous pouvez modifier le code du générateur, veuillez vérifier la solution ci-dessous:
Dans Sybase, le type de données bit accepte les valeurs autres que 0 et 1, mais elles sont toujours interprétées comme 1.
Le processus stocké peut être appelé en passant (-1) ou en passant (3); quand on veut ne pas filtrer en fonction de cette colonne. Et le code du générateur peut être mis à jour pour produire le sql suivant à la volée:
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
.....