【问题标题】:Using variable for UPDATE() the checker if the column is Updated or not使用 UPDATE() 变量检查列是否已更新
【发布时间】:2013-02-28 03:50:55
【问题描述】:

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

【问题讨论】:

  • 您是否试图判断 @ColumnName 变量是否已被上面的选择更新?
  • 是的,我正在尝试检查该列是否已更新
  • 那么你所要做的就是在之前将它设置为null,然后检查它是否不为null。我将在下面的答案中为您写下。
  • 检查一下,您需要声明另一个变量并将其设置为当前变量,以便下次通过循环检查它。见下文。

标签: sql sql-server tsql sql-update


【解决方案1】:

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

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

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

update() 函数将列名作为参数,而不是以名称作为值的字符串变量

例如,在更新set 语句中出现some_column 时,在触发器检查this update(some_column) 中使用update() 为真,即使列的值也不会改变。

您似乎无法编写通用触发器来计算更新的列数,如果您需要该计数,则需要手动为每个表编写触发器,如下所示

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

【讨论】:

  • 另一种计算“更新”列的方法是计算来自Columns_Updated() 的结果中的设置位。不需要列名。
【解决方案2】:

有几点: 您可能希望通过循环处理第一次,因为名称在第一次通过时不会更改。 您可能希望在 @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 

【讨论】:

  • hmmm 我如何检查列是否已更新?我的代码在更新后放在触发器中
  • 哦,触发器部分没有在任何地方提到。您无法检查触发器中语句的变量名称。请参阅下面的答案。
猜你喜欢
  • 2012-08-21
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多