0

我不确定如何描述我想要做的事情,但无论如何我都会尝试,我有 2 个表,分别称为 XYZ 和 bckXYZ。bckXYZ 是为 XYZ 创建的备份表。它们具有相同的列,但列顺序不同。当我在 XYZ 上创建触发器(带星号)时,SQL 给了我一个与列顺序相关的错误。正如我所说,他们的列是相同的,但顺序不同!

我有两个选择,要么将列名一一放入选择脚本而不是使用星号,要么将 bckXYZ 的架构更改为 XYZ。

问题1:为什么触发器需要相同的列顺序?可笑吗?

问题 2:我需要做的是让他们的模式看起来一样,那么有没有脚本可以做到这一点?

不工作

ALTER TRIGGER [dbo].[XYZ_Ins]
ON [dbo].[XYZ]
FOR  INSERT

AS
INSERT INTO dbo.bckXYZ 
SELECT    inserted.*
FROM         inserted

有用

ALTER TRIGGER [dbo].[XYZ_Ins]
ON [dbo].[XYZ]
FOR  INSERT

AS
INSERT INTO dbo.bckXYZ (a,b,c,d,e)
SELECT    (a, b, c, d, e)
FROM         inserted
4

1 回答 1

1

问题1:为什么触发器需要相同的列顺序?这很荒谬吗?

不,这并不荒谬——在构成命令一部分的语句中不需要列名(列可以被计算和未命名)。它所要做的(在这种情况下)是列顺序。selectINSERT ... SELECT

问题 2:我需要做的是让他们的模式看起来一样,那么有没有脚本可以做到这一点?

没有用于重新排列表中列的 SQL 命令。如果您想更改表中列的顺序 - 您不能。如果您使用例如SSMS,它在幕后所做的是创建一个具有调整布局的表,复制所有数据,删除旧表并重命名新表。


尽管如此,即使两个表具有相同的列顺序,我仍然会在INSERT ... SELECT语句中写出明确的列名。我唯一满意的地方select *是 a) 在EXISTS()测试中,和 b) 在一次性/临时查询中。

于 2012-06-27T07:59:53.200 回答