有没有办法定义临时表而不预先定义它的架构?
假设如下:
CREATE PROCEDURE [MySPROC]
AS
BEGIN
CREATE TABLE #tempSubset(
[MyPrimaryKey] [bigint] NOT NULL,
[OtherColumn] [int] NOT NULL)
INSERT INTO #tempSubset (MyPrimaryKey, OtherColumn)
SELECT SomePrimaryKey, SomeColumn
FROM SomeHugeTable
WHERE LimitingCondition = true
SELECT MyPrimaryKey, OtherColumn
FROM #tempSubset
WHERE SomeExpensiveCondition = true
END
Run Code Online (Sandbox Code Playgroud)
当我生成函数导入或映射返回类型时,EF不会生成复杂类型或告诉我:
选定的存储过程或函数不返回任何列
怎么克服这个?
其他答案建议使用表变量(由于性能原因不会这样做)伪造返回模式并注释掉实际存储过程,其他建议与视图类似 ...但必须有一种方法来做到这一点,而不必添加不必要的开销或要求我打破存储过程来更新模型?
试图在sp_Executedsql中选择...到临时表#TempTable.不是它成功插入或没有,但有消息写入(359行受影响)意味着成功插入?下面的脚本
DECLARE @Sql NVARCHAR(MAX);
SET @Sql = 'select distinct Coloum1,Coloum2 into #TempTable
from SPCTable with(nolock)
where Convert(varchar(10), Date_Tm, 120) Between @Date_From And @Date_To';
SET @Sql = 'DECLARE @Date_From VARCHAR(10);
DECLARE @Date_To VARCHAR(10);
SET @Date_From = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+''';
SET @Date_To = '''+CONVERT(VARCHAR(10),DATEADD(d,DATEDIFF(d,0,GETDATE()),0)-1,120)+''';
'+ @Sql;
EXECUTE sp_executesql @Sql;
Run Code Online (Sandbox Code Playgroud)
执行后,它返回我的消息(359行受影响).接下来尝试从#TempTable中选择数据时.
Select * From #TempTable;
Run Code Online (Sandbox Code Playgroud)
它回报我:
Msg 208, Level 16, State 0, Line 2
Invalid object name '#TempTable'.
Run Code Online (Sandbox Code Playgroud)
怀疑它只在'选择'部分工作.插入不起作用.如何解决?
PostgreSQL有相同的MySQL 内存表吗?
这些MySQL内存表可以跨会话持久化(即,与会话结束时丢弃的临时表不同).我无法找到任何可以做同样事情的PostgreSQL.
我有一个使用临时表的MySQL存储过程.假设我的表名是'temp',我用它来存储一些中间数据.它将在程序开始时创建,并将在最后删除.
CREATE PROCEDURE p()
BEGIN
CREATE TEMPORARY TABLE \`temp\`(...);
INSERT INTO \`temp\` VALUES(...);
DROP TEMPORARY TABLE \`temp\`;
END;
Run Code Online (Sandbox Code Playgroud)
问题是这个存储过程可能会被不同的用户同时使用,所以我想知道这是否会导致任何问题(即临时表中插入数据的任何冲突).换句话说临时表是对同一个SP的不同调用内的共享资源吗?
我听过这两个术语"临时表"和"全局临时表"在类似的上下文中使用了很多.
两者有什么区别?
所以,最近DBA试图告诉我们我们不能使用的语法
SELECT X, Y, Z
INTO #MyTable
FROM YourTable
Run Code Online (Sandbox Code Playgroud)
在我们的环境中创建临时表,因为该语法会在执行存储过程的持续时间内导致TempDB锁定.现在,我发现了一些详细说明临时表如何工作,执行范围,清理等的东西.但是对于我的生活,由于它们的使用,我没有看到任何关于阻挡的事情.
我们试图找到证据,证明我们不应该经历并为所有临时表执行CREATE TABLE #MyTable ...但是双方都无法找到证据.我正在寻找人们所拥有的任何见解.
附加信息
目前正在使用SQL Server 2005,很快将成为SQL Server 2008(企业版)
我有一个使用大量数据的存储过程.我将数据插入到临时表中.事件的总体流程是这样的
CREATE #TempTable (
Col1 NUMERIC(18,0) NOT NULL, --This will not be an identity column.
,Col2 INT NOT NULL,
,Col3 BIGINT,
,Col4 VARCHAR(25) NOT NULL,
--Etc...
--
--Create primary key here?
)
INSERT INTO #TempTable
SELECT ...
FROM MyTable
WHERE ...
INSERT INTO #TempTable
SELECT ...
FROM MyTable2
WHERE ...
--
-- ...or create primary key here?
Run Code Online (Sandbox Code Playgroud)
我的问题是什么时候是在#TempTable表上创建主键的最佳时机?我推断在插入所有数据后我应该创建主键约束/索引,因为索引需要在创建主键信息时重新组织.但我意识到我强调的假设可能是错误的......
如果它是相关的,我使用的数据类型是真实的.在#TempTable表中,Col1并Col4会弥补我的主键.
更新:就我而言,我正在复制源表的主键.我知道构成我的主键的字段将始终是唯一的.如果我在最后添加主键,我不关心失败的alter table.
虽然,除此之外,我的问题仍然存在,假设两者都会成功,这个问题会更快吗?
PS如果这是重复,我很抱歉.它可能是基本的,但我找不到类似的东西.
我们刚刚将我们的sql server存储过程转换为oracle程序.Sql Server SP高度依赖于会话表(INSERT INTO #table1...)这些表在oracle中被转换为全局临时表.我们最终为我们的400 SP提供了500 GTT
现在我们发现,由于性能和其他问题,在Oracle中使用GTT是最后的选择.
有什么其他选择吗?收藏?游标?
我们对GTT的典型使用方式如下:
插入GTT
INSERT INTO some_gtt_1
(column_a,
column_b,
column_c)
(SELECT someA,
someB,
someC
FROM TABLE_A
WHERE condition_1 = 'YN756'
AND type_cd = 'P'
AND TO_NUMBER(TO_CHAR(m_date, 'MM')) = '12'
AND (lname LIKE (v_LnameUpper || '%') OR
lname LIKE (v_searchLnameLower || '%'))
AND (e_flag = 'Y' OR
it_flag = 'Y' OR
fit_flag = 'Y'));
Run Code Online (Sandbox Code Playgroud)
更新GTT
UPDATE some_gtt_1 a
SET column_a = (SELECT b.data_a FROM some_table_b b
WHERE a.column_b = b.data_b AND …Run Code Online (Sandbox Code Playgroud) 在SQL Server存储过程中何时使用临时表以及何时使用游标.这是明智的选择吗?
temp-tables ×10
sql-server ×3
mysql ×2
oracle ×2
sql ×2
t-sql ×2
concurrency ×1
database ×1
indexing ×1
plsql ×1
postgresql ×1
primary-key ×1
schema ×1