SQL Trigger:新行:table to new col in:table

时间:2015-01-18 08:34:58

标签: mysql sql-server triggers pivot

我有一个包含几个表的数据库。在另一个表中插入新行后,我需要在一个表中添加一列。

Table A: id | Type | Category | ShortDesc | LongDesc | Active
Row 1 int(11), varchar, varchar,varchar,varchar,int
Row 2
Row 3

Table B: id | Row1-ShortDesc | Row2-ShortDesc | Row3-ShortDesc
Row 1 int(11), tiny(1), tiny(1), tiny(1) etc...
Row 2 
Row 3 

当我偶尔向TableA添加一个新行(项)时,我想在TableB中添加一个新列。 TableA是一个不断发展的集合。由于显而易见的遗留原因,无法删除TableA中的一行。

因此,当我向TableA插入一行时,我需要在TableB中插入/附加另一列。

任何帮助都将不胜感激。

TIA。

1 个答案:

答案 0 :(得分:0)

来自SQL

培训的答案

我终于能够在CINCINNATI OHIO的MAX TRAINING中使用SQL Server中的类来派生和创建我的触发器解决方案。

- SQL代码 - 创建一个名为TableA的表,它只保存触发器的一些数据 - 此表的主键为1,增加1

CREATE TABLE TableA(
id int identity(1,1) PRIMARY KEY,
name varchar(60) NOT NULL,
shortDesc varchar(60) NOT NULL,
longDesc varchar(60) NOT NULL,
bigDesc TEXT NOT NULL
)
GO

- 创建一个只有ID列的TableB表。 ID为主键,以1加1,递增1

CREATE TABLE TableB(
id int identity(1,1) PRIMARY KEY
)
GO

- 只是看到两张表中没有任何内容。

select * from TableA
select * from TableB
GO

- TableA中基于插入

的实际触发器
CREATE TRIGGER TR_myInserCol
ON TableA
AFTER INSERT
AS
BEGIN
-- Don't count the trigger events
    SET NOCOUNT ON;
-- Because we are making strings we declare some variables
    DECLARE @newcol as varchar(60);
    DECLARE @lastRow as int;
    DECLARE @sql as varchar(MAX);
-- Now fill the variables
-- make sure we are looking at the last, freshly inserted row
    SET @lastRow = (SELECT COUNT(*) FROM TableA);
-- Make a SELECT statement for the last row
    SET @newcol = (SELECT shortDesc FROM TableA WHERE id = @lastRow);
-- Adds a new column in TableB is inserted based on a
-- TableA.shortDesc as the name of the new column.
-- You can use any row data you want but spaces and
-- special characters will require quotes around the field.
    SET @sql = ('ALTER TABLE TableB ADD ' + @newcol + ' char(99)');
-- And run the SQL statement as a combined string
    exec(@sql);
END;
GO

- 在TableA中插入新行 - 触发器将触发并在TableB中添加一列

INSERT INTO TableA
(name,shortDesc,longDesc,bigDesc)
VALUES ('attract','Attraction','Attractions','Places to go see and have 
fun');
GO
INSERT INTO TableA
(name,shortDesc,longDesc,bigDesc)
VALUES ('camp','Camp','CAMP GROUND','Great place to sleep next to a creek');
GO
(name,shortDesc,longDesc,bigDesc)
VALUES ('fuel','GasStation','Fueling Depot','Get gas and go');
GO
INSERT INTO TableA
(name,shortDesc,longDesc,bigDesc)
VALUES ('petstore','PetStore','Pet Store','Get a friend');
GO

- 查看TableA中新创建的行和TableB中创建的新列

select * from TableA
select * from TableB
GO

- 除非您要删除新创建的表,否则不要执行。 - 使用此选项删除表格 - 清理工作空间,以便进行更改并重试。

DROP TABLE TableA;
DROP TABLE TableB;
GO

再次感谢那些试图帮助我的人。是的,我仍然明白这可能不是最好的解决方案,但对我来说这是有效的,因为我只会在TableA中插入一行,每年可能会有几次,并且在未来几年内最多可能会少于300行由于我正在使用的数据不经常更改,并且只需一行(T / F)即可访问一行,因此我现在可以快速将TableB分配给位置和人员以获取其搜索条件并生成一个不错的SQL查询字符串,而不会在多个页面上进行多次读取。再次感谢!

如果有人想要添加或修改我所做的事情,我会全力以赴。这完全是为了学习和分享。

迈克尔