我正在尝试根据SQL 2005中的条件结果填充临时表.临时表将具有相同的结构,但将根据条件使用不同的查询填充.下面的简化示例脚本在ELSE块的语法检查中失败,INSERT INTO错误为:
数据库中已经有一个名为"#MyTestTable"的对象.
DECLARE @Id int
SET @Id = 1
IF OBJECT_ID('tempdb..#MyTestTable') IS NOT NULL DROP TABLE #MyTestTable
IF (@Id = 2) BEGIN
SELECT 'ABC' AS Letters
INTO #MyTestTable;
END ELSE BEGIN
SELECT 'XYZ' AS Letters
INTO #MyTestTable;
END
Run Code Online (Sandbox Code Playgroud)
我可以在IF/ELSE语句之前创建临时表,然后只INSERT SELECT在条件块中执行语句,但是表会有很多列,我试图提高效率.这是唯一的选择吗?或者有一些方法可以使这项工作?
谢谢,马特
我有一个带有两列整数数据的临时表,我想找到第三列中两列之间的差异.
#TEMP1
Present previous
59 88
75 75
45 45
77 88
09 08
#temp2
Difference
29
0
0
11
-1
Run Code Online (Sandbox Code Playgroud)
这可能吗 ??
我需要更新表中的位字段,并将该字段设置为true,以获取该表中特定的Ids列表.
ID从外部进程传入.
我想在纯SQL中最有效的方法是创建一个临时表并用Ids填充它,然后用这个连接主表并相应地设置位字段.
我可以创建一个SPROC来获取Ids,但是可能涉及需要这个标志的200-300,000行,所以它可能不是最有效的方式.使用IN语句限制了可以传递的数据量和性能.
如何使用实体框架实现上述目标
我想可以创建一个SPROC来创建一个临时表,但从模型的角度来看这不存在.
有没有办法在运行时动态添加实体.[或者这种方法会引起头痛].
我正在做出上面的假设,虽然填充一个300,000行的临时表并且进行连接会比调用SPROC 300,000倍更快:) [Ids是Guids]
还有其他方法我应该考虑.
CTE(普通表表达式)vs Temp tables或Table variables,哪个更快?
performance temp-tables common-table-expression table-variable sql-server-2008-r2
2个单独的问题.
我正在使用此脚本删除表[求助]
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE_NAME';
DBMS_OUTPUT.PUT_LINE ('Global table TABLE_NAME Dropped');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE ('Global table TABLE_NAME Doesn''t exist.');
END;
/
Run Code Online (Sandbox Code Playgroud)无论如何,如果表"不存在"或者在某些其他会话中使用它(在这种情况下它将被锁定且无法删除),我可以区分.我不确定我是否可以在user_tables中看到该表存在.我不完全了解权限.
我现在已经添加了这个代码
WHEN OTHERS THEN
i_code := SQLCODE;
v_errm := SUBSTR(SQLERRM, 1, 64);
if i_code = -942 THEN
DBMS_OUTPUT.PUT_LINE ('TABLE_NAME doesn''t exist. Script will continue to create it');
ELSE
DBMS_OUTPUT.PUT_LINE ('Error dropping temporary table. The error code is ' || i_code || '- ' || v_errm);
END IF ;
Run Code Online (Sandbox Code Playgroud)
我明白了.在这样的每个程序结束时
END PROCEDURE_NAME;
.
/ …Run Code Online (Sandbox Code Playgroud) DROP TEMPORARY TABLE IF EXISTS data;即使我在顶部检查,我是否需要在存储过程结束时添加?是否存在性能影响?
CREATE DEFINER=`TEST`@`%` PROCEDURE `TEST`() BEGIN
DROP TEMPORARY TABLE IF EXISTS data;
CREATE TEMPORARY TABLE data AS
...
END;
Run Code Online (Sandbox Code Playgroud) 查询:
SELECT ID, T.c.value('@Address', 'nvarchar(20)' ) as Address
INTO #TMP
FROM TABLE1
CROSS APPLY XMLData.nodes('/Document') AS T(c)
UPDATE TABLE1
SET HomeAddress = (SELECT TOP 1 t.Address
FROM #TMP t
WHERE t.ID = ID)
Run Code Online (Sandbox Code Playgroud)
主要是,我需要将数据OUT从XML字段复制到同一个表中的普通字段.
问题:
我是MySQL的新手.我的问题可能是错的,如果请纠正或解释.
我只是通过在Google上搜索定义来阅读有关堆表和临时表的内容. 它们之间的确切区别是什么?两者的实时使用情况如何?
据我所知或我读过的内容:
堆表:存储器中存在的表称为HEAP表.在MySql中创建HEAP表时,用户需要将TYPE指定为HEAP.现在,这些表通常称为内存表.这些内存表永远不会有像"BLOB"或"TEXT"这样的数据类型的值.他们使用索引使它们更快.
临时表:在某些情况下,临时表可能非常有用,可以保留临时数据.临时表是当前客户端会话终止时将删除它们.
我正在尝试将查询结果存储在临时表中以供进一步处理.
create temporary table tmpTest
(
a FLOAT,
b FLOAT,
c FLOAT
)
engine = memory;
insert into tmpTest
(
select a,b,c from someTable
where ...
);
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,插入需要一分钟,而单独的子选择只需要几秒钟.为什么将数据写入临时表而不是将其打印到我的SQL管理工具的输出需要这么长时间?
更新 我的设置:MySQL 7.3.2集群,带有8个Debian Linux ndb数据节点1个SQL节点(Windows Server 2012)
我正在运行select on的表是一个ndb表.
我试图找出,如果执行计划在使用'insert into ..'时会有所不同,但它们看起来一样:(抱歉格式化,stackoverflow没有表格)
id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY <subquery3> ALL \N \N \N \N \N \N 1 PRIMARY foo ref PRIMARY PRIMARY 3 <subquery3>.fooId 9747434 Using where 2 SUBQUERY someTable range PRIMARY PRIMARY 3 \N 136933000 …
我有一个存储过程,其中一部分如下所示:@DRange是传入的varchar值
declare @sql varchar(max)
set @sql = 'select * into #tmpA from TableA where create_date >= getDate - ' + @DRange + '' and is_enabled = 1'
exec (@sql)
select * from #tmpA
Run Code Online (Sandbox Code Playgroud)
问题是当我执行存储过程时,会出现一条错误消息:找不到对象"#tmpA",因为它不存在或者您没有权限.
是不是可以使用临时表并执行它或我做错了什么?
temp-tables ×10
mysql ×3
sql-server ×3
insert-into ×2
performance ×2
sql ×2
t-sql ×2
addition ×1
c# ×1
ddl ×1
heap ×1
oracle ×1
plsql ×1
sql-update ×1