【问题标题】:Not able to INSERT more than 1K records to temp table in SQL [duplicate]无法在 SQL 中向临时表插入超过 1K 条记录 [重复]
【发布时间】:2021-04-24 04:51:19
【问题描述】:

我是 SQL 新手,请帮助我。

我正在尝试向 SQL 临时表插入超过 1k 条记录,但出现此错误:

INSERT 语句中的行值表达式的数量超过了允许的最大行值数 1000 个

请帮助我如何解决将记录插入临时表的问题。我需要插入 5k 条记录,请帮帮我

这是我的脚本

use DatabaseName
SET NOCOUNT ON
Create Table TempRefundDetails (PolicyNumber NVARCHAR(10))

INSERT INTO @TempRefundDetails (PolicyNumber) 
VALUES 
(1),
(2),
(3)
.
.
.
.
(999),
(1000),
(1001),
(1002)
.
.

【问题讨论】:

  • 那些 1K 值从何而来?为什么不使用 BCP 或 BULK INSERT 导入数据?使用脚本插入几十行数据是非常不寻常的。批量命令也最小化日志记录,比简单的 INSERT 性能好得多
  • 您是否尝试通过创建脚本(转储)而不是备份来复制数​​据库?这仅在没有(免费)真实备份的数据库产品中需要

标签: sql sql-server-2012


【解决方案1】:

单个 VALUES() 构造最多只能执行 1'000 - 如果需要更多,则需要重复 INSERT 语句:

INSERT INTO @TempRefundDetails (PolicyNumber) 
VALUES (1), ....., (1000);

INSERT INTO @TempRefundDetails (PolicyNumber) 
VALUES (1001), ....., (2000);

INSERT INTO @TempRefundDetails (PolicyNumber) 
VALUES (2001), ....., (3000);

等等

【讨论】:

  • 或使用 BCP/BULK INSERT 从文件加载数据,而不是编写脚本。虽然我想知道那些 1K 行是从哪里来的?这是另一种尝试使用转储而不是真实备份的尝试吗?
【解决方案2】:

The documentation is explicit 关于此限制,并建议多种解决方法:

当用作 INSERT ... VALUES 语句的 VALUES 子句时,限制为 1000 行。如果行数超过最大值,则返回错误 10738。要插入超过 1000 行,请使用以下方法之一:

  • 创建多个 INSERT 语句
  • 使用派生表
  • 使用 bcp 实用程序、.NET SqlBulkCopy 类、OPENROWSET (BULK ...) 或 BULK INSERT 语句批量导入数据

【讨论】:

【解决方案3】:

根据您插入的实际值的来源,可能会改变插入部分的内容/方式。您是从单个连接插入还是打开和关闭连接以使用数据?这也会改变你的做法。

您正在使用表变量(名称前面的 @ 表示)。请参阅下面的注释和代码,了解问题所在以及如何解决。

use DatabaseName 

SET NOCOUNT ON 

-- this is creating  permeant table not a temp table or table variable.
CREATE Table TempRefundDetails (PolicyNumber NVARCHAR(10))

-- this inserts into a table variable not temp table
INSERT INTO @TempRefundDetails (PolicyNumber)



-- this will create a temp table
IF OBJECT_ID('tempdb..#TempRefundDetails') IS NOT NULL 
    DROP TABLE #TempRefundDetails

CREATE TABLE #TempRefundDetails ( 
    PolicyNumber NVARCHAR(10)
)

INSERT INTO #TempRefundDetails (
    PolicyNumber
)
VALUES (), () -- and so on

OR select from another table source directly into the table

INSERT INTO #TempRefundDetails (
    PolicyNumber
)
Select PolicyNumber
From SomeTableNameHere

【讨论】:

  • 感谢您的回复,我仍然收到同样的错误 - Msg 10738, Level 15, State 1, Line 1017 INSERT 语句中的行值表达式的数量超过了允许的最大行数 1000值。
  • 问题是太多 VALUE 语句,如上面发布的@aaron:stackoverflow.com/a/65799351/1459036 所以可能需要结合他和这个来使用临时表与表变量(表变量不适合大型数据集)
  • 因此,根据您在 VALUE 语句中获取值的方式/方式,您将更改代码,但需要知道在何处/如何获取它们以提供更好的答案。我猜上面的数据不是实际数据,因为如果你只想要数字 1-5000,有更好的方法来做到这一点。
【解决方案4】:

代码的目的不明确,但是可以使用WHILE LOOP插入记录

DECLARE @TempRefundDetails TABLE (PolicyNumber NVARCHAR(10))

DECLARE @cnt INT = 1;

WHILE @cnt < 5001 <-- your number here
BEGIN
   INSERT INTO @TempRefundDetails (PolicyNumber) VALUES (@cnt)
   SET @cnt = @cnt + 1
END

SELECT * FROM @TempRefundDetails

【讨论】:

    猜你喜欢
    • 2017-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多