奇怪的插入错误

时间:2014-09-17 08:08:34

标签: sql sql-server tsql sql-insert

我在执行下面的查询时遇到了生产中的错误

列名或提供的值数与表定义不匹配。

查询:

BEGIN TRANSACTION
BEGIN TRY

 IF  EXISTS (SELECT * FROM Support.sys.objects WHERE object_id = OBJECT_ID(N'[Support]. [dbo].[ReportData]') AND type in (N'U'))
BEGIN
DROP TABLE SUPPORT.[dbo].ReportData
END

 SELECT *,CAST(NULL AS DATETIME) as LoadDate,CAST(NULL AS VARCHAR(100)) AS Action
 INTO Support.[dbo].[ReportData]
 FROM dbo.ReportMain
 WHERE 1 = 0;

UPDATE mso
SET  mso.ReportStatus = '00' 
OUTPUT DELETED.*,
             @LoadDate,
             'UPDATE'
        INTO Support.dbo.ReportData
FROM dbo.ReportMain mso
INNER JOIN dbo.ReportHdr HDR
ON mso.ReportId=HDR.ReportId
WHERE mso.ReportStatus IN ('02','29')

COMMIT;

END TRY
BEGIN CATCH

ROLLBACK;

PRINT 'FAILED !!!';

END CATCH

表dbo.ReportMain最近被删除并在Production中重新创建,添加了一些列并更改了它的顺序,此查询在此修改之前正确执行。

任何人都可以解释为什么会发生此错误

1 个答案:

答案 0 :(得分:2)

因为这个脚本没有在ReportMain表中插入任何内容,所以我对使用*通配符选择器非常怀疑,所以它有点鲁莽在使用select...intooutput时执行此操作。正如其中一条注释所述,因为ReportMain表的列现在不保证具有相同的顺序,所以使用显式列名来避免错误,甚至更糟......将数据插入错误的列