当尝试在临时表中插入6000行时,我收到以下消息
INSERT语句中的行值表达式数超过 允许的最大行数1000行。
来源不在SQL Server
。
CREATE TABLE #TMP_ISIN (
[Isin] nVARCHAR(250))
INSERT INTO #TMP_ISIN ([Isin])
VALUES
ABOUT 6000 ROWS
我该怎样做才能避免这个限制?
答案 0 :(得分:12)
limit of 1000取决于values
的{{1}}子句中的行数,而不是临时表本身的限制:
直接在VALUES列表中插入行可以构造的最大行数为1000. 如果行数超过1000,则返回错误10738。
要插入超过1000行,请使用以下方法之一:
- 创建多个INSERT语句;
- 使用派生表;
- 使用
insert
实用程序或bcp
声明批量导入数据。
因此,您可以使用较小的BULK INSERT
语句以块的形式执行此操作。
insert
如果你需要所有6000都是原子的,你可以围绕整个事情进行交易。
答案 1 :(得分:1)
这只是VALUES
子句的问题。如果您通过此方法插入超过1000行(可疑方法但是嘿),那么使用SELECT
语句与UNION ALL
一起使用:
INSERT #a (a,b)
SELECT 'a', 'b' UNION ALL
SELECT 'c', 'd' UNION ALL
SELECT ...etc
这样做的另一个好处是,您可以在执行SELECT
之前检查INSERT
语句中的结果集 - 使用VALUES
构造不会让您感到奢侈。< / p>
答案 2 :(得分:0)
通过使用 Microsoft 所说的派生表,很很容易绕过这个限制:
DROP TABLE IF EXISTS #test;
CREATE TABLE #test(
id integer identity(1,1) primary key,
name varchar(48),
etc varchar(255)
);
INSERT INTO #test(name,etc)
SELECT * FROM ( -- add this line
VALUES
('apple','Red round thing with a worm in it.'),
('banana','Long yellow thing to feed monkeys.'),
('cherry','Small black thing for cocktails.')
-- thousands more rows
) AS whatever(a,b) -- add this line
;
代码类似于 INSERT … VALUES …
,但从虚拟派生表复制值。
如您所见,VALUES
的别名是 whatever
,别名和列都是任意的;它们不会以任何方式影响数据复制。
说真的,我不明白微软为什么要对 INSERT 语句强加 1000 行这个愚蠢的限制,如果它很容易解决的话。
我想这是微软的事情……1000 行应该足够任何人使用了。