如何在SQL Server 2005中使用BIT?

5

关于SQL性能问题。

我有一个标量值函数,用于检查基础中的某些特定条件,它返回True或False的BIT值。

现在我不知道该如何填写@BIT参数。

如果我这样写:

set @bit = convert(bit,1)

或者

set @bit = 1

或者
set @bit='true'

这个函数可以工作,但我不知道哪种方法适合日常使用。

另一个问题是,我的数据库中有一个表,大约有400万条记录,每天会插入大约4K条记录。

现在我想在该表上添加一个标量值函数的约束条件,就像这样:

如下所示:

ALTER TABLE fin_stavke
ADD CONSTRAINT fin_stavke_knjizenje CHECK ( dbo.fn_ado_chk_fin(id)=convert(bit,1))

这里的“id”是表fin_stavke的主键,而dbo.fn_ado_chk_fin看起来像

create FUNCTION fn_ado_chk_fin
(
    @stavka_id int
)
RETURNS bit
AS
BEGIN
declare @bit bit

if exists (select * from fin_stavke where id=@stavka_id and doc_id is null and protocol_id is null)
        begin
            set @bit=0


        end
    else
        begin
            set @bit=1
        end
return @bit;
END
GO

这种类型和方法的约束检查会对我的表格和SQL性能产生负面影响吗?

如果有更好的方法来控制这个表格,请告诉我。


一个比特被赋值为0或1,所以如果你声明@bit作为Bit,那么你应该使用set @bit = 1或set @bit = 0。这是我的想法。 - Lazarus
MSSQL 不在乎你如何设置它。你可以将其设置为“true”,然后将其与1进行比较,SQL 也不会介意。 - DForck42
4个回答

4
我可能错了,但从外表看来,你只想检查doc_idprotocol_id不都是NULL,对吗?
您可以添加一个表约束来实现这一点。
ALTER TABLE fin_stavke
ADD CONSTRAINT fin_stavke_knjizenje CHECK ( doc_id IS NOT NULL OR protocol_id IS NOT NULL)

+1,这正是我所想的,但前提是fin_stavke.id是唯一的,在这种情况下这似乎是一个合理的假设。 - KM.
1
@adopilot - 我已经把你的评论印出来并装裱好了。下次我和我妻子争论的时候,这会派上用场。 - Lieven Keersmaekers

2

I'd use

 set @bit = 1

把 true 赋值给一个位(bit)感觉很安全,而将其转换似乎没有意义。


1

我一直看到比特被用作1或0。我建议坚持这样做。每个人都知道你在干什么。

这种约束会影响插入的性能,但不会太多,因为你将寻找表的主键。这可能是您可以执行的最便宜的查找操作。


1

可以使用整数值设置位变量:

set @bit = 1

有时候为了避免隐式转换,你需要一个实际的比特值,那么你可以进行显式转换:
set @bit = cast(1 as bit)

当将其分配给变量时,实际上没有什么区别,但在查询中,转换会在解析查询时发生,而不是在执行查询时发生。我已经使用过它几次,并获得了实际的性能差异。


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