|
|
1
14
在触发器内部,您可以使用
但是当您有一个超过62列的表时,这个代码片段会失败。啊,溢出… 这里是最终版本,它处理超过62列,但只给出更新列的数目。很容易与“syscolumns”链接以获取名称
|
|
|
2
19
我有另一个完全不同的解决方案,它不使用任何更新的列,也不依赖于在运行时构建动态SQL。(您可能希望在设计时使用动态SQL,但这是另一种情况。) 基本上你从 the inserted and deleted tables ,取消对每个字段的透视,以便为每个字段保留唯一的键、字段值和字段名列。然后加入这两个元素并过滤所有已更改的内容。 下面是一个完整的工作示例,包括一些测试调用,以显示记录的内容。
所以不要纠结于bigint位域和arth溢出问题。如果您知道在设计时要比较的列,那么您不需要任何动态SQL。 另一方面,输出的格式不同,所有字段值都转换为sql_变量,第一个字段值可以通过再次旋转输出来固定,第二个字段值可以通过根据您对表设计的了解重新复制到所需类型来固定,但这两个字段值都需要一些复杂的动态sql。这两个问题在XML输出中可能都不是问题。这个 question 执行类似于以相同格式返回输出的操作。 编辑:查看下面的注释,如果您有一个可以更改的自然主键,那么您仍然可以使用此方法。您只需要使用newid()函数添加一个默认情况下由guid填充的列。然后使用此列代替主键。 您可能希望向该字段添加索引,但由于触发器中已删除和插入的表在内存中,因此可能不会使用它,并且可能会对性能产生负面影响。 |
|
|
3
4
我只做了简单的“一行”。不使用、透视、循环、许多变量等,使其看起来像程序化编程。应使用SQL处理数据集:—),解决方案是:
它使用 COLUMNS_UPDATED ,处理8个以上的列-它可以处理任意多个列。 它注意正确的列顺序,应该使用 COLUMNPROPERTY . 它是基于视图的 COLUMNS 因此,它可能只包括或排除特定的列。 |
|
|
4
1
在没有硬编码列名的情况下,我唯一能做到这一点的方法是将已删除表的内容放到临时表中,然后根据表定义构建一个查询,以比较临时表和实际表的内容,并根据列列表的分隔与否返回一个列列表。比赛。诚然,下面是详细的。
|
|
|
5
1
下面的代码适用于64个以上的列,只记录更新的列。遵循评论中的说明,一切都应该很好。
|
|
|
6
0
Rick提供的示例代码缺少对多行更新的处理。 请让我将Rick的版本增强如下:
|
|
|
Saijo-Shi · PLpgsql中的更新触发器 1 年前 |
|
|
user26814368 · Oracle在触发器中过滤错误数据 1 年前 |
|
|
robertspierre · 在多对多关系中自动删除未引用的行 2 年前 |
|
|
Martin · 由于活动触发器,无法登录到SQL Server 2 年前 |
|
|
gonzalo2000 · 脚本在手动运行时有效,但触发器不起作用 2 年前 |
|
|
yessoos · 在触发的处理程序中使用类属性 2 年前 |