我们正在从头开始开发一个应用程序,使用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(我可以接受这一点,只是为了解决位问题)。
有何建议?