临时表 - 允许的最大行数1000

Tra*_*dad 5 sql-server temporary limit

当试图在临时表中插入6000行时,我收到以下消息

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

来源不在SQL Server.

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

INSERT INTO #TMP_ISIN ([Isin])
VALUES
ABOUT 6000 ROWS
Run Code Online (Sandbox Code Playgroud)

我该如何避免这个限制?

pax*_*blo 13

1000限制是在values子句中的行数insert而不是临时表本身的限制:

通过直接在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>;
Run Code Online (Sandbox Code Playgroud)

如果你需要所有6000都是原子的,你可以围绕整个事情进行交易.


Man*_*ngo 5

通过使用 Microsoft 称为派生表的内容,\xe2\x80\x99s容易绕过此限制绕过此限制:

\n
DROP TABLE IF EXISTS #test;\nCREATE TABLE #test(\n    id integer identity(1,1) primary key,\n    name varchar(48),\n    etc varchar(255)\n);\n\nINSERT INTO #test(name,etc)\nSELECT * FROM (     --  add this line\nVALUES\n    (\'apple\',\'Red round thing with a worm in it.\'),\n    (\'banana\',\'Long yellow thing to feed monkeys.\'),\n    (\'cherry\',\'Small black thing for cocktails.\')\n    --  thousands more rows\n) AS whatever(a,b)  --  add this line\n;\n
Run Code Online (Sandbox Code Playgroud)\n

代码类似于INSERT \xe2\x80\xa6 VALUES \xe2\x80\xa6,但从虚拟派生表复制值。

\n

如您所见, 的别名VALUESwhatever并且别名和列都是任意的;它们不会以任何方式影响数据复制。

\n

该解决方案间接来自https://learn.microsoft.com/en-us/sql/t-sql/queries/table-value-constructor-transact-sql?redirectedfrom=MSDN&view=sql-server-ver15#c-specifying -多个值作为子句中的派生表

\n

说真的,我不明白为什么 Microsoft 对 INSERT 语句强加 1000 行这个愚蠢的限制,如果它\xe2\x80\x99s 很容易解决它。

\n

我想它\xe2\x80\x99s是微软的东西\xe2\x80\xa6 1000行应该对任何人来说都足够了。

\n