2013-02-28 60 views
-1

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

你是不是想告诉我们,如果@ColumnName变量已被上面的select更新了吗? – darin 2013-02-28 04:06:17

+0

是的,我正在尝试检查列是否已更新 – 2013-02-28 04:11:59

+0

然后,您只需将其设置为null,然后检查它是否不为空。我会在下面的答案中为你写。 – darin 2013-02-28 04:18:22

回答

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 
+0

谢谢我会稍后再试XD – 2013-02-28 05:20:15

+0

嗯如何检查列是否更新?我的代码是在更新 – 2013-02-28 05:47:20

+0

后放在触发器中哦,触发器部分在任何地方都没有提及。您无法检查触发器中语句的变量名称。请参阅下面的答案。 – darin 2013-02-28 14:08:25

2

检查列实际更新更新触发 后,您可以使用deletedinserted特殊表中msdn触发代码可以找到更新表

记住它的新版本和旧版本的行有可能在每个表格中找到多于一行。比如你在触发行数由some_condition影响执行update table1 set col1 = value1 where some_condition,将在inserteddeleted

提交找出触发在哪些行一些列实际更新,你可以加入插入,在一些主要删除的表此列

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

例如在触发器使用update()检查thisupdate(some_column)为真时some_column存在于更新set声明中,列值的偶数值不变。

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

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