使用变量UPDATE()方格如果列被更新或不(Using variable for UPDATE()

2019-08-17 05:07发布

是否有可能使用UPDATE(),它检查是否有列被更新或不变量?

这里是我的示例代码:

DECLARE @ColumnCount int
DECLARE @ColumnCounter int
DECLARE @ColumnName nvarchar(MAX)

SET @ColumnCounter = 0

SELECT @ColumnCount =  COUNT(c.COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS c  WHERE c.TABLE_NAME = 'Province'
    WHILE @ColumnCount >= @ColumnCounter
    BEGIN
       SELECT @ColumnName = c.COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS c  WHERE c.TABLE_NAME = 'Province' AND c.ORDINAL_POSITION = @ColumnCounter
        IF (UPDATE(@ColumnName))
       SET @ColumnCounter = @ColumnCounter + 1
    END

Answer 1:

有几件事情:您可能希望通过循环处理的第一时间,因为名称不会改变,通过第一次。 您可能要处理的时候@ColumnName为null,因为这将意味着你的查询没有返回一行虽然低于您的查询应该总是返回一个值。

DECLARE @ColumnCount INT 
DECLARE @ColumnCounter INT 
DECLARE @ColumnName NVARCHAR(max) 
DECLARE @temp varchar(max)

SET @ColumnCounter = 0 

SELECT @ColumnCount = Count(c.column_name) 
FROM   information_schema.columns c 
WHERE  c.table_name = 'Province' 

WHILE @ColumnCount >= @ColumnCounter 
  BEGIN 
      SET @ColumnName = NULL 

      SELECT @ColumnName = c.column_name 
      FROM   information_schema.columns c 
      WHERE  c.table_name = 'Province' 
             AND c.ordinal_position = @ColumnCounter 

      IF ( @ColumnName != @temp ) 
        BEGIN 
        --do something 
        END
      SET @temp = @ColumnName
      SET @ColumnCounter = @ColumnCounter + 1 
  END 


Answer 2:

检查列实际更新触发更新后,您可以使用deletedinserted特殊表MSDN中触发代码可以找到更新表的行新版本和旧版本

记住,这是有可能找到有每个表超过100列。 例如在执行update table1 set col1 = value1 where some_condition中的行数触发影响由some_condition ,将被呈现在inserteddeleted

要找出触发在哪些行一些列实际更新,你可以加入插入,在一些主键删除表和比较这列的值

update()函数采用作为参数的列名不是一个刺变量与名作为值

例如使用update()中检查触发此 update(some_column)时为真some_column存在于更新set语句,偶数列的值不改变。

好像你不能写通用触发计数列数更新,如果你需要的数量,你需要手动编写触发器为每个表像这样somethig

declare @count int = 0
if update(col1) set @count = @count + 1
if update(col2) set @count = @count + 1
...


文章来源: Using variable for UPDATE() the checker if the column is Updated or not