如果列已更新,则使用UPDATE()检查器的变量

时间:2013-02-28 03:50:56

标签: sql sql-server tsql sql-update

是否可以在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

2 个答案:

答案 0 :(得分:5)

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

请记住,每个表中可以找到多于一行的行。例如,您在update table1 set col1 = value1 where some_condition影响的触发行数中执行some_condition,将在inserteddeleted表中显示

在触发器中查找某些列实际更新的行,您可以在某些主键上连接已插入和已删除的表并比较此列的值

update()函数作为参数列名而不是名称为值

的sting变量

例如在触发器update()中使用update(some_column)时,some_column set在更新declare @count int = 0 if update(col1) set @count = @count + 1 if update(col2) set @count = @count + 1 ... 语句中出现时为{{1}},即使列值未更改也是如此。

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

{{1}}

答案 1 :(得分: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