我们正在将Sybase ASE用于我们正在从头开发的应用程序。我们有包含Bit列的表。在Sybase中,位数据类型不能为空。这适用于我们存储在表中的记录,但是我们的SEARCH存储过程存在设计问题。我们在很大程度上依赖于存储过程的代码生成器和相应的数据访问层类(在.NET中使用Dapper)。由于我们无法将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位问题。我们可以创建一个可以为空的custome tinyint数据类型,并且只允许0和1.如果我们改为tinyint,我们别无选择,只能将数据访问类的布尔属性更改为int16(我没关系,只是解决这个问题。)
有什么建议吗?
答案 0 :(得分: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
.....