Sybase BIT Datatype Filterung

dapper sql sybase sybase-ase

Frage

Wir verwenden Sybase ASE für eine Anwendung, die wir von Grund auf entwickeln. Wir haben Tabellen mit Bit-Spalten. In Sybase dürfen Bit-Datentypen nicht null sein. Dies ist für die Datensätze, die wir in den Tabellen speichern, in Ordnung, aber wir haben ein Designproblem für unsere gespeicherten Prozeduren SUCHEN. Wir stützen uns stark auf Code-Generatoren für unsere gespeicherten Prozeduren und die entsprechenden Datenzugriffsschichtklassen (in .NET mit Dapper). Da es uns nicht möglich ist, NULL für die Bit-Parameter an unsere gespeicherten Prozeduren SUCHEN zu übergeben, können wir nur Datensätze mit 1 oder 0 Werten in den Bit-Spalten abrufen. Beispiel unten:

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

Es gibt Problemumgehungen wie das Einführen eines anderen BIT-Parameters, um anzugeben, ob die Bitspalte übersprungen werden soll, aber da wir die Codegeneratoren für gespeicherte Prozeduren schreiben und pflegen, möchten wir die gespeicherten Prozeduren so einfach wie möglich halten. Ganz zu schweigen davon, dass dies für jede Bitspalte / jeden Parameter getan werden muss. Ein anderer Weg ist natürlich, den Bit-Datentyp in Tinyint zu ändern. Aber ist das ein gültiges / gutes Design? Scheint mir nicht eine gute Übung zu sein, aber das sollte alle unsere Sybase-Bit-Probleme beheben. Wir können einen custome tinypint-Datentyp erstellen, der nullable sein kann und nur 0 und 1 zulassen soll. Wenn wir zu tinyint wechseln, haben wir keine andere Wahl, als die booleschen Eigenschaften unserer Datenzugriffsklassen in int16 zu ändern (ich bin damit einverstanden) um das Bit Problem zu umgehen).

Irgendein Rat?

Beliebte Antwort

Auf der Grundlage des obigen Generators wird das Passieren von Nullmitteln nicht basierend auf dieser Spalte gefiltert. Wenn Sie den Generatorcode ändern können, überprüfen Sie bitte die folgende Lösung:

In Sybase akzeptiert der Bitdatentyp, dass die Werte außer 0 und 1 akzeptiert werden, aber immer als 1 interpretiert werden.

Der gespeicherte Prozess kann durch Übergeben von (-1) oder Übergeben (3) aufgerufen werden; wenn man darauf abzielt, nicht anhand dieser Spalte zu filtern. Und der Code des Generators kann aktualisiert werden, um den folgenden sql on the fly zu erzeugen:

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 
.....


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum