上面的更改列数是“or”的关系,不是"and"的关系

解决方案 »

  1.   

    IF (COLUMNS_UPDATED()) 测试是否插入或更新了提及的列,仅用于 INSERT 或 UPDATE 触发器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。COLUMNS_UPDATED 函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。如果在表上创建的触发器包含 8 列以上,则 COLUMNS_UPDATED 返回多个字节,最左边的为最不重要的字节。在 INSERT 操作中 COLUMNS_UPDATED 将对所有列返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。可以在触发器主体中的任意位置使用 COLUMNS_UPDATED。IF (COLUMNS_UPDATED())判断提及的一列或多列是插入还是更新,仅用于 INTSERT 或 UPDATE 触发器中。COLUMNS_UPDATED 返回 varbinary 位模式,该位模式表示表的哪些列进行了插入操作,哪些列进行了更新操作。可以在触发器主体中的任意位置使用 COLUMNS_UPDATED。bitwise_operator是用于比较运算的位运算符。updated_bitmask是整型位掩码,表示实际更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 触发器,若要检查列 C2、C3 和 C4 是否都有更新,指定值 14;若要检查是否只有列 C2 有更新,指定值 2。comparison_operator是比较运算符。使用等号 (=) 检查 updated_bitmask 中指定的所有列是否都实际进行了更新。使用大于号 (>) 来检查 updated_bitmask 中指定的列是否有进行过更新的,或者没有全部进行更新。column_bitmask是要检查的列的整型位掩码。
      

  2.   

    它是用来判断修改的是那个字段。例如
    if columns_updated()='字段名'
     处理。
      

  3.   

    这个我知道,但是你仔细看看:
    如果必须测试影响到表中前 8 列以外的列的更新时,必须使用 UBSTRING 函数测试由 COLUMNS_UPDATED 返回的适当的位。
    这句话,要用substring
    而且如果用if columns_update()='字段名'来处理的话
    如果我要判断修改的列有20列的话,我岂不是要写20个columns_update()?
      

  4.   

    11111111 11111111 11111111 你18个列,应该返回3个字节,
    5,6,8,一组  2的4次方 + 2的5次方 + 2的7次方 = 176
    10,15,16,一组  2的(9-8)次方 + 2的(14-8)次方 +2的(15-8)次方 = 194 
    18 一组 2的(18-16)次方 = 4IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1)=power(2,(5-1))
          + power(2,(6-1)) + power(2,(8-1))) 
          AND (SUBSTRING(COLUMNS_UPDATED(),2,1)=power(2,(2-1)) 
          + power(2,(6-1)) + power(2,(7-1)))
          AND (SUBSTRING(COLUMNS_UPDATED(),3,1)=power(2,(2-1)))
        )
      

  5.   

    COLUMNS_UPDATED 函数以从左到右的顺序返回位,最左边的为最不重要的位。
    最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。
    如果在表上创建的触发器包含 8 列以上,则 COLUMNS_UPDATED 返回多个字节,最左边的为最不重要的字节。
      

  6.   

    TO:HawaiiLeo(罗马数字)
    上面的一段代码含义是:18个列只要有一个列更改就触发呢还是要所有的列都更改才触发?
    就是是“or”还是“and ”?
    谢谢