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都是原子的,你可以围绕整个事情进行交易.
通过使用 Microsoft 称为派生表的内容,\xe2\x80\x99s很容易绕过此限制绕过此限制:
\nDROP 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;\nRun Code Online (Sandbox Code Playgroud)\n代码类似于INSERT \xe2\x80\xa6 VALUES \xe2\x80\xa6,但从虚拟派生表复制值。
如您所见, 的别名VALUES是whatever并且别名和列都是任意的;它们不会以任何方式影响数据复制。
说真的,我不明白为什么 Microsoft 对 INSERT 语句强加 1000 行这个愚蠢的限制,如果它\xe2\x80\x99s 很容易解决它。
\n我想它\xe2\x80\x99s是微软的东西\xe2\x80\xa6 1000行应该对任何人来说都足够了。
\n