【问题标题】:SQL Trigger to copy data to table with more number of columnsSQL触发器将数据复制到具有更多列数的表
【发布时间】:2017-05-17 00:07:55
【问题描述】:

我有一个包含大约 150 列的表 (tableA),我想在插入表 A 的任何新数据时将数据从表 A 复制到另一个表 (表 B)。表 B 具有与表 A 相同的表结构还有一些额外的列。

我是触发器的新手,我正在阅读以下链接中的示例:https://www.codeproject.com/Articles/25600/Triggers-SQL-Server

由于我有包含 150 列的 tableA,有没有更简单的方法来指定触发器中的列,而不是声明 150 个变量,选择 150 个变量等于插入的值,然后将其插入到 tableB。这使得触发代码非常长。我想知道是否有更简单的方法来指定 150 列。

谢谢

【问题讨论】:

  • 首先,编写触发器的方式完全错误。您不声明 150 个变量(或任何变量),然后选择它们,插入到另一个表中。那只是破碎,缓慢和浪费。您只需直接从“插入”集合中插入到另一个表中。是的,您仍然应该列出每一列(最佳实践),但您不声明任何变量。触发器不会“按行”执行,但按事件...插入、更新和删除都可以影响多行。

标签: sql sql-server triggers


【解决方案1】:

一个简单的复制触发器应该如下所示:

CREATE TRIGGER MyTrigger ON MyTable
FOR INSERT
AS 
BEGIN
    INSERT INTO MyOtherTable (Column1, Column2, Column3... Column150)
       SELECT (Column1, Column2, Column3... Column150)
       FROM inserted;
END

拥有 150 列的表是个问题,而且根本不是好的设计。也就是说,这是你必须处理的。您需要在 INSERT 和 SELECT 语句中分别列出每一个。这将是一次痛苦,但这确实是最好/唯一的方法。通过这样做,您可以确保正确的数据进入正确的列,并且如果/当将列添加到任一表时,不会出现任何中断。

为了帮助完成创建列列表的繁琐部分,您可以使用类似这样的 SQL 为您生成列表:

DECLARE @sql nvarchar(max);
SET @sql = N'';
SELECT @sql += QUOTENAME(COLUMN_NAME) + N', '
  FROM INFORMATION_SCHEMA.COLUMNS 
 WHERE TABLE_NAME = 'MyTable'
SELECT @sql;

只需将表的名称替换为您希望为“MyTable”复制的列的子集,就可以了。当然,这假设匹配的列在两个表中具有完全相同的名称。如果有任何差异,您需要手动对齐应该获得适当数据的那些。

【讨论】:

  • 感谢您的建议,我一定会使用它。
  • 是否可以这样写:INSERT INTO MyOtherTable (@sql) SELECT (@sql) FROM inserted;
  • 没有。您必须列出 SQL 中的显式列名。你不能在那里使用变量。因此,只需从运行第二个 SQL 块中复制列名列表即可。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 2010-09-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
相关资源
最近更新 更多