SQL Server 临时表-允许的最大行数为1000行值

kzmpq1sx  于 2022-12-03  发布在  其他
关注(0)|答案(3)|浏览(703)

当尝试向临时表中插入6000行时,我收到以下消息
INSERT语句中的行值表达式数超过了允许的最大值1000。
源不在SQL Server中。

CREATE TABLE #TMP_ISIN (
   [Isin] nVARCHAR(250))

INSERT INTO #TMP_ISIN ([Isin])
VALUES
ABOUT 6000 ROWS

我该怎么做才能避免这个限制呢?

busg9geu

busg9geu1#

limit of 1000是对insertvalues子句中的行数的限制,而不是对临时表本身的限制:

**直接在VALUES列表中插入行所能构造的最大行数为1000。**如果行数超过1000,则返回错误10738。

若要插入1000个以上的数据列,请使用下列其中一种方法:

  • 创建多个INSERT语句;
  • 使用派生表;
  • 使用bcp公用程式或BULK INSERT陈述式大量汇入数据。

因此,您可以使用较小的insert语句分块执行。

insert into sometable (somecolumns) values <about 1000 rows>;
insert into sometable (somecolumns) values <about 1000 rows>;
:
insert into sometable (somecolumns) values <about 1000 rows>;

如果您需要所有6000个都是原子的,则可以围绕整个事务放置一个事务。

xxls0lw8

xxls0lw82#

通过使用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,别名和列都是任意的;它们不会以任何方式影响数据复制。
解决方案间接来自https://learn.microsoft.com/en-us/sql/t-sql/queries/table-value-constructor-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15#c-specifying-multiple-values-as-a-derived-table-in-a-from-clause。
说真的,我不明白为什么微软对INSERT语句施加1000行的愚蠢限制,如果它很容易解决的话。
我想这是微软的东西... 1000行对任何人来说都足够了。

jchrr9hc

jchrr9hc3#

这只是VALUES子句的问题。如果用这种方法插入的行超过1000行(方法有点问题,但是嘿),那么就使用一组SELECT语句和UNION ALL

INSERT #a (a,b)
SELECT 'a', 'b' UNION ALL
SELECT 'c', 'd' UNION ALL
SELECT ...etc

这样做的另一个好处是,您可以在执行INSERT之前检查来自SELECT语句的结果集--使用VALUES构造就不会有这样的优势。

相关问题