【问题标题】:Temporary Table - Maximum allowed number of 1000 row values临时表 - 允许的最大 1000 行值数
【发布时间】:2015-05-19 08:05:45
【问题描述】:

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

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

源不在SQL Server

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

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

我该如何避免这个限制?

【问题讨论】:

    标签: sql-server limit temporary


    【解决方案1】:

    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 都是原子的,您可以围绕整个事物放置一个事务。

    【讨论】:

      【解决方案2】:

      这只是VALUES 子句的问题。如果您通过这种方法插入超过 1000 行(有问题的方法,但是嘿),那么使用一组带有 UNION ALLSELECT 语句:

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

      这还有一个优点,您可以在执行 INSERTs 之前检查来自 SELECT 语句的结果集 - 您不会使用 VALUES 构造来获得这种奢侈。

      【讨论】:

        【解决方案3】:

        非常很容易通过使用微软所说的派生表来解决这个限制:

        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 行应该对任何人都足够了。

        【讨论】:

          猜你喜欢
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 2013-04-22
          • 2013-10-10
          • 2013-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多