代码之家  ›  专栏  ›  技术社区  ›  adopilot

如何在SQL Server 2005中使用位

  •  5
  • adopilot  · 技术社区  · 15 年前

    关于SQL性能。

    我有一个标量值函数用于检查基中的某些特定条件,它返回位值为真或假。

    我现在不知道该如何填充@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的性能产生不良影响吗?

    如果还有更好的方法在这个表上添加控件,请告诉我。

    4 回复  |  直到 15 年前
        1
  •  4
  •   Lieven Keersmaekers    15 年前

    我可能是错的,但从表面上看,你似乎只想检查一下,不是两者都要检查。 doc_id protocol_id NULL ?

    您可以添加 表约束 为了达到这个目的。

    ALTER TABLE fin_stavke
    ADD CONSTRAINT fin_stavke_knjizenje CHECK ( doc_id IS NOT NULL OR protocol_id IS NOT NULL)
    
        2
  •  2
  •   Hans Olsson    15 年前

    我会用

     set @bit = 1
    

    它是安全的(将“真”指定为“有点感觉错误”),而“转换”似乎毫无意义。

        3
  •  1
  •   Jon    15 年前

    我一直看到比特被用作1或0。我会坚持的。每个人都会知道你在做什么。

    这个约束将影响插入的性能,但不会影响太多,因为您正在寻找表的主键。这可能是你能做的最便宜的查找。

        4
  •  1
  •   Guffa    15 年前

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

    set @bit = 1
    

    有时需要实际的位值以避免隐式转换,然后可以执行excplicit转换:

    set @bit = cast(1 as bit)
    

    当将它赋给变量时,没有实际的区别,但是在查询中,转换将在解析查询时发生,而不是在执行查询时发生。我用了几次,得到了实际的性能差异。