【问题标题】:INSERT w/subquery INTO another table - overflow errorINSERT w/subquery INTO另一个表 - 溢出错误
【发布时间】:2011-01-25 21:37:16
【问题描述】:

我一直在尝试使用来自this 问题的以下 SQL 语句将数据从一个 Access 表插入到链接的 SQL Server 表中,为我的目的而修改 - 但我不断收到“溢出”作为错误消息:

INSERT INTO dbo_tblGageActivity(strGageID, strCustJobNum, datDateEntered, datTimeEntered)
SELECT [Gage ID] as GageID, [Customer Job#] as JobNum, [Date] as DateEntered, 
[Time Entered] as TimeEntered FROM TblInstTrak;

我已经尝试了很多方法,都导致了“溢出”错误。我一定错过了什么,但对于我的生活,我不知道是什么。 > 100,000 条记录对于一个插入子查询来说是否太多了?

-- 编辑于 2011 年 1 月 25 日 @ 1540 小时--

字段的数据类型和大小如下:

TblInstTrak          Type:Size     Required     dbo_tblGageActivity          Type:Size      Required
----------------------------------------------------------------------------------------------------
Gage ID              Text:50       True         strGageID                    Text:50        True
Customer Job#        Text:50       False        strCustJobNum                Text:50        True
Date                 Date/Time:8   False        datDateEntered               Date/Time:8    True
Time Entered         Date/Time:8   False        datTimeEntered               Date/Time:8    True

-- 编辑于 2011 年 1 月 26 日 @ 1355 小时--

好的 - 我已经为此苦苦思索了几天(在我带着它来到 SO 之前,它就在这里的那一天),我能想出的唯一区别是输入日期字段本地应用程序端的格式为“m/d/yyyy”,本地应用程序端的“输入时间”字段格式为“长时间”——SQL Server 表中的这些字段均未设置任何格式。

出于性能原因,我开始怀疑是否有更好的方法现在将所有当前数据提取到表中 - 然后仅将本地应用程序中的更新提取到镜像 SQL Server 副本中。没有数据输入到 SQL Server 端副本中,它仅用于我的测试应用程序的性能 - 唯一更改的数据是在本地应用程序端。这种方法会比每次我想更新它时擦除 SQL Server 数据库表并重新填充它更容易吗?

-- 编辑于 2011 年 1 月 28 日 @ 1236 小时--

在找到罗马帝国时代的一些日期后(感谢 David Fenton 为我指出这一点),我将 import SQL 语句修改为以下内容:

INSERT INTO dbo_tblGageActivity(strGageID, strCustJobNum, datDateEntered, datTimeEntered)
SELECT [Gage ID] as GageID, [Customer Job#] as JobNum, [Date] as DateEntered, 
[Time Entered] as TimeEntered FROM TblInstTrak WHERE [Date] >=1/1/1900;

我得到了几个非常棒的答案,我只能选择一个答案(精神痛苦)所以请不要生气 - 这真的帮助我学习。

【问题讨论】:

  • 你能插入任何行吗?
  • 源列和目标列的数据类型是什么?
  • 不,它工作了大约两分钟 - 然后抛出溢出错误 - 目标表中没有任何结果(dbo_tblGageActivity)
  • 我不认为 > 100,000 条记录应该是个问题。我能够毫无问题地完成 800 万条记录...
  • 如果您将SELECT 更改为仅返回TOP 10 或其他小东西...是否执行插入过程?

标签: sql-server ms-access vba


【解决方案1】:

发生溢出是因为所选行中的一个或多个值不适合您尝试插入的表。换句话说,在TblInstTrak 中,您的值不适合dbo_tblGageActivity 中各自的列。比较两个表的定义,并确保目标表列足够宽以容纳源表中的数据。

【讨论】:

  • 问题是我做到了 - 两者中的列是相同的。 SQL Server 表有一个唯一的 ID 列,而原始表没有。如果我限制 SELECT 子查询 - 它可以工作,如果我不这样做 - 它会出错。
【解决方案2】:

Access 中的日期值是否超出 SQL Server 日期/时间字段的范围?这是我在将旧的 Access 数据库升级到 SQL Server 时遇到的一个非常非常常见的问题 - 很多手指错误实际上是在罗马帝国晚期的日期!

【讨论】:

  • 我查看了源数据 - 有四个项目有“不可靠的日期”,1/4/111、5/4/111、12/1/804、6/1/822 .一些日期在 20 世纪初,但不应该按原样导入它们 - 因为它们在本地数据库中有效?
  • @Comrad_Durandal:smalldatetime 的下限日期是 1900 年 1 月 1 日,datetime 的下限日期是 1753 年 1 月 1 日。如您所见,您的“古怪约会”不适合这两者。所以他们很可能是你的问题的原因。
  • @Andriy M - 如何防止导入此类行,同时能够导入正常的行?
  • 我通常会编辑问题数据以修复错误的日期。在我处理过的数据的大多数情况下,可以从记录中的其他数据或大约在同一时间创建的记录中找出预期的日期。
【解决方案3】:

如果您使用 OLEDB 提供程序链接它,则有一个最大插入提交大小的属性 在此处查看更多详细信息: http://www.bidn.com/blogs/ShawnHarrison/ssis/803/maximum-insert-commit-size

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 2013-01-28
    • 2012-02-07
    • 2016-06-15
    • 2016-09-10
    • 2011-05-13
    • 2018-07-09
    • 2022-01-10
    • 2015-08-15
    相关资源
    最近更新 更多