Sybase BIT数据类型过滤

4

我们正在从头开始开发一个应用程序,使用Sybase ASE。 我们有一些带有位(Bit)列的表。 在Sybase中,位(Bit)数据类型不能为null。 这对于我们存储在表中的记录来说是可以接受的,但对于我们的SEARCH存储过程存在设计问题。 我们严重依赖代码生成器来生成存储过程和相应的数据访问层类(在.NET中使用Dapper)。 由于我们无法将NULL传递给搜索存储过程的位(Bit)参数,因此我们只能检索具有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参数来指示是否跳过匹配位列,但由于我们编写和维护存储过程代码生成器,我们希望尽可能保持存储过程的简单性。更不用说这必须针对每个位列/参数进行处理。另一种方法当然是将bit数据类型更改为tinyint。但这是一个有效/好的设计吗?对我来说似乎不是一个好的做法,但这应该可以解决我们所有的Sybase bit烦恼。我们可以创建一个可空的自定义tinyint数据类型,只允许0和1。如果我们更改为tinyint,则将不得不将我们的数据访问类的布尔属性更改为int16(我可以接受这一点,只是为了解决位问题)。
有何建议?
1个回答

0

基于上述生成器,传入null表示不按该列进行过滤。如果您可以修改生成器代码,请查看以下解决方案:

在Sybase中,位数据类型接受除0和1以外的值,但始终被解释为1。

存储过程可以通过传递(-1)或(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 
.....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接