在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,或者是否所有内容都发生在内存中,我已经阅读了相互矛盾的意见.
在哪种情况下,一个人胜过另一个?
有一个复杂的SELECT查询,我想从中将所有行插入表变量,但是T-SQL不允许它.
同样,您不能将表变量与SELECT INTO或INSERT EXEC查询一起使用. http://odetocode.com/Articles/365.aspx
简短的例子:
declare @userData TABLE(
name varchar(30) NOT NULL,
oldlocation varchar(30) NOT NULL
)
SELECT name, location
INTO @userData
FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30
Run Code Online (Sandbox Code Playgroud)
表变量中的数据稍后将用于将其插入/更新回不同的表(大多数是具有次要更新的相同数据的副本).这样做的目的是简单地使脚本比SELECT INTO直接进入正确的表更易读,更容易定制.性能不是问题,因为rowcount它相当小,只在需要时手动运行.
......或者告诉我,如果我做错了.
我正在学习表变量的更多细节.它表示临时表总是在磁盘上,表变量在内存中,也就是说,表变量的性能优于临时表,因为表变量比临时表使用更少的IO操作.
但有时,如果表变量中的记录太多而无法包含在内存中,则表变量将像临时表一样放在磁盘上.
但我不知道"太多记录"是什么.100,000条记录?或1000,000条记录?我怎么知道我正在使用的表变量是在内存中还是在磁盘上?SQL Server 2005中是否有任何函数或工具来测量表变量的大小或让我知道何时将表变量从内存放入磁盘?
我们可以在调试时间内在SQL Server Management Studio(SSMS)中看到表值变量中的值(行和单元格)吗?如果有,怎么样?

你能index在一个表变量上创建SQL Server 2000吗?
即
DECLARE @TEMPTABLE TABLE (
[ID] [int] NOT NULL PRIMARY KEY
,[Name] [nvarchar] (255) COLLATE DATABASE_DEFAULT NULL
)
Run Code Online (Sandbox Code Playgroud)
我可以在Name上创建索引吗?
我在脚本中有一个表变量(不是存储过程).两个问题:
这是我的代码:
Declare @projectList table(
name varchar(40) NOT NULL);
Insert Into @projectList
Values ('BCR-00021')
Select *
From @projectList
Drop Table @projectList -- does not work
Run Code Online (Sandbox Code Playgroud) 反正是否在T-SQL中循环表变量?
DECLARE @table1 TABLE ( col1 int )
INSERT into @table1 SELECT col1 FROM table2
Run Code Online (Sandbox Code Playgroud)
我也使用游标,但游标似乎不如表变量灵活.
DECLARE cursor1 CURSOR
FOR SELECT col1 FROM table2
OPEN cursor1
FETCH NEXT FROM cursor1
Run Code Online (Sandbox Code Playgroud)
我希望能够以与游标相同的方式使用表变量.这样我就可以在过程的一个部分中对表变量执行一些查询,然后为表变量中的每一行执行一些代码.
任何帮助是极大的赞赏.
在我的存储过程中,我在我的过程之上声明了两个表变量.现在我试图在动态sql语句中使用该表变量,但是在执行该过程时出现此错误.我正在使用Sql Server 2008.
这是我的查询的样子,
set @col_name = 'Assoc_Item_'
+ Convert(nvarchar(2), @curr_row1);
set @sqlstat = 'update @RelPro set '
+ @col_name
+ ' = (Select relsku From @TSku Where tid = '
+ Convert(nvarchar(2), @curr_row1) + ') Where RowID = '
+ Convert(nvarchar(2), @curr_row);
Exec(@sqlstat);
Run Code Online (Sandbox Code Playgroud)
我得到以下错误,
必须声明表变量"@RelPro".必须声明表变量"@TSku".
我试图在动态查询的字符串块之外取表,但无济于事.
有没有办法定义临时表而不预先定义它的架构?
我有一个T-SQL 表变量(不是表),它有一个自动递增的标识列.我想清除此变量中的所有数据并将标识列值重置为1.如何才能完成此操作?
table-variable ×10
sql-server ×9
sql ×5
t-sql ×5
temp-tables ×3
cursor ×1
debugging ×1
dynamic-sql ×1
indexing ×1
insert ×1
schema ×1
ssms ×1