我正在使用以下代码检查临时表是否存在,如果存在,则在再次创建之前删除该表.只要我不更改列,它就可以正常工作.如果我稍后添加一列,则会显示错误"无效列".请让我知道我做错了什么.
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
select company, stepid, fieldid from #Results
--Works fine to this point
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
NewColumn NVARCHAR(50)
)
select company, stepid, fieldid, NewColumn from #Results
--Does not work
Run Code Online (Sandbox Code Playgroud) 是否可以在不使用create table语句并指定每个列类型的情况下从select语句创建临时(仅会话)表?我知道派生表能够做到这一点,但那些是超临时的(仅限语句),我想重用.
如果我不必编写create table命令并保持列列表和类型列表匹配,那么可以节省时间.
在SQL Server 2005中,我们可以通过以下两种方式之一创建临时表:
declare @tmp table (Col1 int, Col2 int);
Run Code Online (Sandbox Code Playgroud)
要么
create table #tmp (Col1 int, Col2 int);
Run Code Online (Sandbox Code Playgroud)
这两者有什么不同?关于@tmp是否仍然使用tempdb,或者是否所有内容都发生在内存中,我已经阅读了相互矛盾的意见.
在哪种情况下,一个人胜过另一个?
我正在学习表变量的更多细节.它表示临时表总是在磁盘上,表变量在内存中,也就是说,表变量的性能优于临时表,因为表变量比临时表使用更少的IO操作.
但有时,如果表变量中的记录太多而无法包含在内存中,则表变量将像临时表一样放在磁盘上.
但我不知道"太多记录"是什么.100,000条记录?或1000,000条记录?我怎么知道我正在使用的表变量是在内存中还是在磁盘上?SQL Server 2005中是否有任何函数或工具来测量表变量的大小或让我知道何时将表变量从内存放入磁盘?
创建临时表并声明数据类型之后;
CREATE TABLE #TempTable(
ID int,
Date datetime,
Name char(20))
Run Code Online (Sandbox Code Playgroud)
然后,如何插入已保存在数据库中物理表上的相关数据?
SQL Server中的本地和全局临时表有什么区别?
我的数据库包含三个名为Object_Table,Data_Table和的表Link_Table.链接表只包含两列,对象记录的标识和数据记录的标识.
我想复制从数据DATA_TABLE在那里它与一个给定对象的身份,并插入相应的记录到Data_Table和Link_Table一个不同的给定对象的身份.
我可以通过选择一个表变量并通过为每次迭代执行两次插入来循环来完成此操作.
这是最好的方法吗?
编辑:我想避免循环有两个原因,第一个是我懒惰,循环/临时表需要更多代码,更多代码意味着更多地方犯错误,第二个原因是关注性能.
我可以将所有数据复制到一个插入中,但是如何将链接表链接到每个记录都有新ID的新数据记录?
哪个更高效,CTE或者Temporary Tables?
sql-server performance temp-tables common-table-expression sql-server-2008
我现在正在忙着实现一个类别的过滤器,我需要为每个"标签"生成一个INNER JOIN clausse来过滤.
问题是在一大堆SQL之后,我有一个表包含了我选择所需的所有信息,但是每次生成的INNER JOIN我都需要它
这基本上看起来像:
SELECT
*
FROM search
INNER JOIN search f1 ON f1.baseID = search.baseID AND f1.condition = condition1
INNER JOIN search f2 ON f2.baseID = search.baseID AND f2.condition = condition2
...
INNER JOIN search fN ON fN.baseID = search.baseID AND fN.condition = conditionN
Run Code Online (Sandbox Code Playgroud)
这有效,但我更喜欢"搜索"表是临时的(如果它不是一个普通的表,它可以小几个数量级),但这给我一个非常烦人的错误: Can't reopen table
一些研究引导我查看这个错误报告,但MySQL的人们似乎并不关心这样的基本功能(使用多次表)不适用于临时表.我遇到了很多关于此问题的可伸缩性问题.
有没有可行的解决方法,不需要我管理潜在的大量临时但非常真实的表或让我维护一个包含所有数据的大表?
亲切的问候,克里斯
[额外]
GROUP_CONCAT答案在我的情况下不起作用,因为我的条件是按特定顺序排列的多个列,它会使OR成为我需要的AND.但是,它确实帮助我解决了早期的问题,所以现在不再需要表格,不管是不是临时表格.我们只是想对我们的问题过于笼统.过滤器的整个应用现在已经从大约一分钟恢复到大约四分之一秒.
这似乎是MySQL没有数组变量.我应该用什么呢?
似乎有两种选择建议:集类型标量和临时表.我联系的问题暗示了前者.但是使用这些而不是数组变量是一种好习惯吗?或者,如果我使用集合,那么基于集合的成语相当于foreach什么?
temp-tables ×10
sql-server ×7
mysql ×3
sql ×2
alter-table ×1
arrays ×1
create-table ×1
insert ×1
performance ×1
select ×1
set ×1
variables ×1