将表变量中的值插入到已经存在的临时表中

Posted

技术标签:

【中文标题】将表变量中的值插入到已经存在的临时表中【英文标题】:Insert Values from Table Variable into already EXISTING Temp Table 【发布时间】:2016-05-06 21:54:39 【问题描述】:

我成功地将表变量中的值插入到新的(尚不存在的表)临时表中。插入少量行(例如 10,000)时没有问题,但是当插入表变量时,很多行(例如 30,000)会引发错误“服务器内存和外部资源不足)。 要解决这个问题: 我将我的 (60,000) 表变量行分成小批量(例如 10,000 个),我认为我可以将新数据插入到已经存在的临时表中,但我收到以下错误消息:

数据库中已经有一个名为“##TempTable”的对象。

我的代码是:

USE MyDataBase;
Go

Declare @@TableVariable TABLE
(
[ID] bigint PRIMARY KEY,
[BLD_ID] int NOT NULL
-- 25 more columns
)
Insert Into @@TableVariable VALUES
(1,25),
(2,30)
-- 61,000 more rows

Select * Into #TempTable From @@TableVariable;
Select Count(*) From #TempTable;

以下是我收到的错误消息

【问题讨论】:

我猜这是对脚本的限制。 请记住@@Tables 存储在内存中,因此如果您收到“OutOfmemory”消息,可能是您没有足够的内存。如果可以的话,我建议创建一个 pyhiscal tempTable(没有@@Table)并检查是否收到相同的消息。 没有创建任何东西的权限...您是否知道我是否可以从表变量源将新数据添加到现有的 TempTable 中? 【参考方案1】:

问题是 SELECT INTO 想要创建目标表,所以在第二次运行时出现错误。

首先你必须创建#TempTable:

/* this creates the temptable copying the @TableVariable structure*/
Select * 
Into #TempTable 
From @TableVariable
where 1=0;

现在您可以循环遍历您的批次并根据需要多次调用此插入。

insert Into #TempTable 
Select * From @TableVariable;

注意#TempTable 与##TempTable 不同(# = Local,## = Global),完成后记得将其删除。

你也应该使用@@作为你的表变量,只使用@TableVariable

希望对你有帮助

【讨论】:

以上是关于将表变量中的值插入到已经存在的临时表中的主要内容,如果未能解决你的问题,请参考以下文章

将表作为参数传递给函数

我想在临时表中插入数据[关闭]

SQL 中将游标循环查询的结果插入到临时表中

在 oracle 临时表中插入 1000 多个长数字

雪花我们如何遍历临时表的每一行并将其值插入到另一个表中,其中每个字段的值都是单行?

从mysql 5.7中的变量将多行插入表中