问题描述
我是 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