当尝试向临时表中插入6000行时,我收到以下消息
INSERT语句中的行值表达式数超过了允许的最大值1000。
源不在SQL Server
中。
CREATE TABLE #TMP_ISIN (
[Isin] nVARCHAR(250))
INSERT INTO #TMP_ISIN ([Isin])
VALUES
ABOUT 6000 ROWS
我该怎么做才能避免这个限制呢?
当尝试向临时表中插入6000行时,我收到以下消息
INSERT语句中的行值表达式数超过了允许的最大值1000。
源不在SQL Server
中。
CREATE TABLE #TMP_ISIN (
[Isin] nVARCHAR(250))
INSERT INTO #TMP_ISIN ([Isin])
VALUES
ABOUT 6000 ROWS
我该怎么做才能避免这个限制呢?
3条答案
按热度按时间busg9geu1#
limit of 1000是对
insert
的values
子句中的行数的限制,而不是对临时表本身的限制:**直接在VALUES列表中插入行所能构造的最大行数为1000。**如果行数超过1000,则返回错误10738。
若要插入1000个以上的数据列,请使用下列其中一种方法:
bcp
公用程式或BULK INSERT
陈述式大量汇入数据。因此,您可以使用较小的
insert
语句分块执行。如果您需要所有6000个都是原子的,则可以围绕整个事务放置一个事务。
xxls0lw82#
通过使用Microsoft所称的派生表,可以 * 非常 * 容易地绕过此限制:
该代码类似于
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行对任何人来说都足够了。
jchrr9hc3#
这只是
VALUES
子句的问题。如果用这种方法插入的行超过1000行(方法有点问题,但是嘿),那么就使用一组SELECT
语句和UNION ALL
:这样做的另一个好处是,您可以在执行
INSERT
之前检查来自SELECT
语句的结果集--使用VALUES
构造就不会有这样的优势。