我在执行下面的查询时遇到了生产中的错误
列名或提供的值数与表定义不匹配。
查询:
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中重新创建,添加了一些列并更改了它的顺序,此查询在此修改之前正确执行。
任何人都可以解释为什么会发生此错误
答案 0 :(得分:2)
因为这个脚本没有在ReportMain
表中插入任何内容,所以我对使用*
通配符选择器非常怀疑,所以它有点鲁莽在使用select...into
或output
时执行此操作。正如其中一条注释所述,因为ReportMain
表的列现在不保证具有相同的顺序,所以使用显式列名来避免错误,甚至更糟......将数据插入错误的列