我有以下程序:
CREATE PROCEDURE foo ()
SELECT * FROM fooBar INTO TEMP tempTable;
-- do something with tempTable here
DROP TABLE tempTable;
END PROCEDURE;
Run Code Online (Sandbox Code Playgroud)
如果在调用DROP TABLE之前发生异常会发生什么?foo退出后,tempTable还会出现吗?
如果是这样,foo可能会在下次调用时失败,因为tempTable已经存在.应如何处理.
编辑:我正在使用informix 11.5
我正在尝试使用C#中的dapper执行一系列SQL*Server步骤.一步创建临时表并填充它.以下步骤从临时表中查询数据.create/populate似乎运行成功,但临时表中的第一个查询失败说:
"无效的对象名称'#GetPageOfGlobalUsers'."
using (SqlConnection connection = DBConnectionProvider.CreateConnection())
{
... misc setup stuff...
connection.Execute(@"
create table #GetPageOfGlobalUsers(row int, EmailAddress nvarchar(max), LastName nvarchar(max), FirstName nvarchar(max), Id uniqueidentifier)
insert into #GetPageOfGlobalUsers
SELECT ROW_NUMBER() OVER (order by LastName, FirstName, EmailAddress) row,
EmailAddress, LastName, FirstName, Id
FROM Users
WHERE LastName like @search or FirstName like @search or EmailAddress like @search
", new { search = search }
);
int count = connection.Query<int>(@"
SELECT count(*) from tempdb..#GetPageOfGlobalUsers
").Single<int>();
... more queries from the temp table follow …Run Code Online (Sandbox Code Playgroud) 我多次看到这个问题,但我找不到让我满意的答案。基本上人们和书籍所说的是“虽然临时表在超出范围时会被删除,但您应该在不再需要它们时显式删除它们以减少服务器上的资源需求”。
我很清楚,当您在管理工作室工作并创建表时,在关闭窗口或断开连接之前,您将使用该表的一些资源,从逻辑上讲,最好删除它们。
但是当你使用过程时,如果你想清理表,你很可能会在它真正结束时这样做(我不是在谈论当你真的不需要它时你立即删除表的情况程序)。所以工作流程是这样的:
当您投入 SP 时:
据我所知,当你不放弃时它怎么可能工作:
这里有什么区别?我只能想象需要一些资源来识别临时表。还有其他想法吗?
更新:
我用 2 个 SP 进行了简单的测试:
create procedure test as
begin
create table #temp (a int)
insert into #temp values (1);
drop table #temp;
end
Run Code Online (Sandbox Code Playgroud)
另一个没有 drop 语句。我启用了用户统计并运行了测试:
declare @i int = 0;
while @i < 10000
begin
exec test;
SET @i= @i + 1;
end
Run Code Online (Sandbox Code Playgroud)
如图所示,当我不删除临时表时,所有统计数据都相同或有所减少。
更新2:
我第二次运行了这个测试,但现在有 10 万次调用,并且还添加了 SET NOCOUNT ON。这些是结果:

由于第二次运行确认,如果您不删除 SP 中的表,那么您实际上节省了一些用户时间,因为这是由其他一些内部进程完成的,但在用户时间之外。
正如标题所说,我正在尝试将 CSV 插入到临时表中。不幸的是,我遇到了错误。
这是查询:
USE DATABASE5000
CREATE TABLE #tempTable1
(
ID INT,
CD VARCHAR(50),
ESD DATETIME,
EED DATETIME,
MiscDate DATETIME,
SQ SMALLINT
)
BULK INSERT #tempTable1
FROM 'C:\Dir\Folder\BestFile.csv';
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
消息 4832,级别 16,状态 1,第 1 行
批量加载:数据文件中遇到意外的文件结尾。消息 7399,级别 16,状态 1,第 1 行
链接服务器“(null)”的 OLE DB 提供程序“BULK”报告了错误。提供者没有提供有关错误的任何信息。消息 7330,级别 16,状态 2,第 1
行无法从链接服务器“(空)”的 OLE DB 提供程序“BULK”中获取一行。
有任何想法吗?谢谢你们。
我正在对一个远程链接服务器进行一些相当复杂的查询,能够在临时表中存储一些信息然后对它进行连接是有用的 - 所有这些都与远程数据有关.在本地创建临时表并通过线路连接它们的速度非常慢.
是否可以强制在远程服务器上创建临时表?假设我没有足够的权限来创建我自己的真实(永久)表.
我正在GLOBAL TEMPORARY TABLEDB2中创建一个.当我冲浪时,我有两种方式来创建1.声明2.创建.
1. DECLARE GLOBAL TEMPORARY TABLE SESSION.TEMP_EMP
(EMPNO CHAR(6) NOT NULL,
SALARY DECIMAL(9, 2),
BONUS DECIMAL(9, 2),
COMM DECIMAL(9, 2)) WITH REPLACE ON COMMIT PRESERVE ROWS ;
2. CREATE GLOBAL TEMPORARY TABLE TMPDEPT
(TMPDEPTNO CHAR(3) NOT NULL,
TMPDEPTNAME VARCHAR(36) NOT NULL,
TMPMGRNO CHAR(6),
TMPLOCATION CHAR(16) ) ON COMMIT PRESERVE ROWS ;
Run Code Online (Sandbox Code Playgroud)
从IBM站点我得到了一个信息,创建是最好的,因为它是持久的,允许所有用户会话访问相同的表定义,而无需在启动时声明它和更多的优势.
链接:http://www.ibm.com/developerworks/data/library/techarticle/dm-0912globaltemptable/
我在使用create over declare时遇到的问题很少:
使用时我找不到Replace关键字CREATE GLOBAL TEMPORARY TABLE.
考虑一个场景,我打开一个连接并执行一个存储过程,
在该存储过程中创建全局临时表,并在该存储过程中调用另一个存储过程,它再次具有sameCreate Temp表语句..在这种情况下会发生什么.它会抛出任何错误,因为两个表naes是相同的并且在单个连接中?
声明有会话和创建没有?? 这与持久性有关吗?
在表现明智哪个更好?声明临时或创建临时?
建议一些最佳使用declare/create的场景!!
我有一个使用内存引擎创建的临时表如下:
CREATE TEMPORARY TABLE IF NOT EXISTS some_text (
id INT DEFAULT 0,
string varchar(400) DEFAULT ''
) engine = memory;
Run Code Online (Sandbox Code Playgroud)
当我插入行时,我遇到#1114错误,因为表已满.它在mysql文档中解释了更改tmp_table_size和max_heap_table_size不做任何事情来增加用户创建的临时表的大小,这是我认为我在这里.如何让这张桌子更大?
我希望能够通过调用SET动态做到这一点,但我已经试过设置tmp_table_size和max_heap_table_size他们都远远超出我在此表中预期的数据量.那么有谁知道如何在这个表上解决这个错误?谢谢任何帮助过的人.
我在postgres数据库上工作,我将使用混合的关系表和jsonb表(可以索引).
我正在使用大量的CTE查询来插入或更新从临时表中选择的数据,例如:
WITH information as (
select fieldA, fieldB, fieldC from tableA
)
insert (fieldA, fieldB, fieldC)
SELECT inf.fieldA, inf.fieldB, inf.fieldC
from information inf
Run Code Online (Sandbox Code Playgroud)
好吧,我想知道是否有可能在这种表中创建临时索引,如果是,是否可以在jsonb类型fieds中创建索引?(考虑这个临时表)
在我们的项目中,我创建了一些全局临时表,如下所示:
CREATE GLOBAL TEMPORARY TABLE v2dtemp (
id NUMBER,
GOOD_TYPE_GROUP VARCHAR2(250 BYTE),
GOOD_CODE VARCHAR2(50 BYTE),
GOOD_TITLE VARCHAR2(250 BYTE)
)
ON COMMIT PRESERVE ROWS;
Run Code Online (Sandbox Code Playgroud)
但问题出现的时候我想放弃这张桌子.甲骨文不会让我放弃表,它说:
ORA-14452: attempt to create, alter or drop an index on temporary table already in use
Run Code Online (Sandbox Code Playgroud)
我必须在某些过程中使用此表,但可能会根据其他报告进行更改.所以我应该总是丢弃表,然后我应该用我需要的字段重新创建它.
出于某些商业原因,我必须使用它,所以我不可能使用表格或其他东西.我只能使用临时表.我尝试了提交删除行,但是当我调用我的过程来使用此表中的数据时,表中没有更多行,并且它们已被删除.
任何帮助将非常感谢,提前感谢
///编辑
public void saveJSONBatchOpenJobs(final JSONArray array, MtdReport report) {
dropAndCreateTable();
String sql = "INSERT INTO v2d_temp " +
"(ID, KARPARDAZ, GOOD_TYPE_GROUP, GOOD_CODE, GOOD_TITLE, COUNT, "
+ "FACTOR_COUNT, GHABZ_COUNT, DEAL_NO, DEAL_DATE, REQUEST_NO, REQUEST_DATE, "
+ "REQUEST_CLIENT, STATUS, TYPE, MTDREPORT_ID, …Run Code Online (Sandbox Code Playgroud) 我一直在研究运行缓慢的旧审核存储过程,通过应用索引并使查询更可查询,我取得了一些成功。
但是,存储过程仍需要一分钟以上才能完成。我认为问题出在临时表插入。我确实尝试将索引应用于临时表,但这只会降低性能,因为:
表上索引的数量是影响插入性能的最主要因素。表具有的索引越多,执行速度就越慢。插入语句是唯一不能直接从索引中受益的操作,因为它没有where子句。
SQL代码
我在审核过程中花费了最长的时间并包含了执行计划的审核过程的代码摘要发布在了下面。
SELECT dbo.[Audit Result Entry Detail].PK_ID,
dbo.[Audit Result Entry Detail].......
45-50 other columns selected from Audit Result Entry Detail
(Note i need to select all these)
dbo.[Audit Register].Audit_Date,
dbo.[Audit Register].Audit_Type,
dbo.[Audit Register].ContextUser
INTO #temp5
FROM dbo.[Audit Result Entry Detail]
INNER
JOIN dbo.[Audit Register]
ON dbo.[Audit Result Entry Detail].FK_RegisterID = dbo.[Audit Register].PK_ID
INNER
JOIN (
SELECT MAX(Audit_Date) AS DATE,
FK_RegisterID
FROM dbo.[Audit Result Entry Detail]
INNER
JOIN dbo.[Audit Register]
ON dbo.[Audit Result Entry Detail].FK_RegisterID = dbo.[Audit Register].PK_ID …Run Code Online (Sandbox Code Playgroud) temp-tables ×10
sql ×5
sql-server ×4
performance ×2
bulkinsert ×1
c# ×1
dapper ×1
database ×1
db2 ×1
ddl ×1
informix ×1
jsonb ×1
memory ×1
mysql ×1
oracle ×1
plsql ×1
postgresql ×1