我不确定我是如何描述我想要做的但是无论如何都会尝试,我有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
IT工作
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
答案 0 :(得分:1)
问题1:为什么触发器需要相同的列顺序?这太荒谬了吗?
不,这并不荒谬 - 在构成select
命令一部分的INSERT ... SELECT
语句中,列名不是 required (列可以是计算和未命名的)。所有它必须继续(在这种情况下)是列顺序。
问题2:我需要做的是让他们的模式看起来一样,所以有任何脚本可以做到吗?
没有SQL命令可以重新排列表中的列。如果要更改表中列的顺序 - 则不能。如果您使用例如SSMS,它在幕后的作用是创建一个带有调整后布局的 new 表,复制所有数据,删除旧表并重命名新表。
所有这些,甚至如果两个表具有相同的列顺序,我仍然会在INSERT ... SELECT
语句中写出显式列名。我对select *
感到满意的唯一地方是a)在EXISTS()
测试中,b)在一次性/刮擦查询中。