无法在 SQL 中将超过 1K 的记录插入到临时表中

问题描述

我是 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)
.
.

解决方法

使用单个 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);

等等

,

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

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

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

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

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

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
,

代码用途不明确,但可以使用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