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

时间:2015-05-19 08:05:45

标签: sql-server limit temporary

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

  

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

来源不在SQL Server

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

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

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

3 个答案:

答案 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,别名和列都是任意的;它们不会以任何方式影响数据复制。

解决方案间接来自https://docs.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 行应该足够任何人使用了。