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

ado*_*lot 5 sql t-sql sql-server performance sql-server-2005

关于SQL性能.

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

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

如果我写.

set @bit = convert(bit,1)
Run Code Online (Sandbox Code Playgroud)

要么

set @bit = 1
Run Code Online (Sandbox Code Playgroud)

要么

set @bit='true'
Run Code Online (Sandbox Code Playgroud)

函数无论如何都会工作,但我不知道建议日常使用哪种方法.

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

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

像这样的东西

ALTER TABLE fin_stavke
ADD CONSTRAINT fin_stavke_knjizenje CHECK ( dbo.fn_ado_chk_fin(id)=convert(bit,1))
Run Code Online (Sandbox Code Playgroud)

其中"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
Run Code Online (Sandbox Code Playgroud)

这种类型和检查约束的方法会不会影响我的表和SQL的性能?

如果还有更好的方法来增加对此表的控制,请告诉我.

Lie*_*ers 4

我可能是错的,但从表面上看,你似乎只想检查不是两者都是doc_id和? protocol_idNULL

您可以添加表约束来实现此目的。

ALTER TABLE fin_stavke
ADD CONSTRAINT fin_stavke_knjizenje CHECK ( doc_id IS NOT NULL OR protocol_id IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)