Sybase BITデータ型のフィルタリング

dapper sql sybase sybase-ase

質問

私たちはゼロから開発しているアプリケーションにSybase ASEを使用しています。ビット列を持つテーブルがあります。 Sybaseでは、Bitデータ型をnullにすることはできません。これはテーブルに格納されているレコードでは問題ありませんが、SEARCHストアドプロシージャの設計上の問題があります。私たちはストアドプロシージャと対応するデータアクセスレイヤークラス(Dapperを使用した.NET)のコードジェネレータに大きく依存しています。 BitパラメータのNULLをSEARCHストアドプロシージャに渡すことはできないため、1または0の値を持つレコードのみをBit列に取り出すことができます。以下の例:

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

ビット列の一致をスキップするかどうかを示すために別のBITパラメータを導入するなどの回避策がありますが、ストアドプロシージャのコードジェネレータを記述して維持するので、ストアドプロシージャをできるだけシンプルに保ちたいと考えています。言い換えれば、これはすべてのビット列/パラメータに対して行われなければならない。別の方法はもちろん、ビットデータ型をtinyintに変更することです。しかし、これは有効な/良いデザインですか?私にとっては優れた方法ではないようですが、Sybaseのすべての問題を解決するはずです。 tinyintに変更すると、データアクセスクラスのブール値のプロパティをint16に変更するだけです(これで私は大丈夫です。ちょうどいいです。ビットの問題を回避する)。

何かアドバイス?

人気のある回答

上記のジェネレータに基づいて、NULLを渡すことは、その列に基づいてフィルタリングしないことを意味します。ジェネレータコードを変更できる場合は、以下の解決策を確認してください。

Sybaseでは、ビットデータ型で、0と1以外の値を受け入れますが、常に1と解釈されます。

格納されたprocは、(-1)またはpassing(3)を渡すことで呼び出すことができます。その列に基づいてフィルタリングしないことを目指しているときです。そしてジェネレータのコードを更新して、オンザフライで次のSQLを生成することができます:

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


ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ