我应该如何在SQL Server 2005中使用BIT

时间:2010-04-27 14:24:09

标签: sql sql-server sql-server-2005 performance tsql

关于SQL性能。

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

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

如果我写。

set @bit = convert(bit,1)

set @bit = 1

set @bit='true'

功能无论如何都会起作用,但我不知道建议日常使用哪种方法。

另一个问题是,我的基础表中有大约400万条记录,每日插入大约是该表中的4K记录。

现在我想在该表上添加带有标量值函数的CONSTRAINT,我已经提到了

像这样的东西

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的性能?

如果还有更好的方法可以在这张桌子上添加控制权,请告诉我。

4 个答案:

答案 0 :(得分: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 :(得分:2)

我用

 set @bit = 1

这是安全的(分配确实有点感觉不对)转换似乎毫无意义。

答案 2 :(得分:1)

我总是看到比特用作1或0.我会坚持这一点。每个人都会知道你在做什么。

由于您正在寻找表的主键,因此该约束将影响插入的性能,但影响不大。这可能是你能做的最便宜的查询。

答案 3 :(得分:1)

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

set @bit = 1

有时你想要一个实际的比特值以避免隐式转换,然后你可以做一个明确的转换:

set @bit = cast(1 as bit)

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