【问题标题】:Weird Insert error奇怪的插入错误
【发布时间】:2014-09-17 08:08:33
【问题描述】:

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

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

查询:

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 最近已在生产环境中删除并重新创建,添加了一些列,并且其顺序已更改,并且此查询在此修改之前正确执行。

谁能解释为什么会发生这个错误

【问题讨论】:

  • 如果你说ReportMain 的列顺序发生了变化,问题很可能是SELECT * ... INTO Support.[dbo].[ReportData] FROM dbo.ReportMain,但ReportData 的结构没有变化,这可以解释错误。

标签: sql sql-server tsql sql-insert


【解决方案1】:

因为这个脚本没有在ReportMain 表中插入任何东西,所以我非常怀疑* 通配符选择器的使用,所以在使用select...intooutput 时这样做有点鲁莽.作为cmets之一,由于ReportMain表的列现在不保证具有相同的顺序,使用显式列名来避免错误,甚至更糟糕的是......将数据插入错误的列

【讨论】:

  • 不确定你的第一(半)句是什么意思,但其余的我可以同意:)
  • @DrCopyPaste 第一个“半句”绝对符合他得到的错误和问题中提供的信息。如果你把它放在上下文中,意思会变得更清楚;)
  • 嗯,仍然觉得它读起来很奇怪,因为它读起来就像 OP 得到了错误,@ 987654326@,但正如你稍后在你的答案中确定的那样,错误本身就是由于列顺序不一致。
  • 好的,所以这个错误是由于列顺序的变化造成的。我认为选择*进入并输出删除。*在同一张表上应该以相同的顺序返回列。
猜你喜欢
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多