虽然你可以象数组一样使用一个数据表变量,对于它能够使用的数据类型是有限制的。例如,你不能在一个数据表变量中包含另一个数据表变量。
你可以象申明一个用户定义的数据表一样申明一个数据表变量;但是,在你申明了它以后,你就不能再改变数据表的定义了。另外,你必须在申明的时候定义数据表变量的所有属性。
并不是所有的INSERT命令都能够在数据表变量上操作。例如,你不能在向数据表变量插入值的时候使用EXEC命令。执行一个存储过程或者插入值到数据表变量的字符串命令会返回一个错误。同样,不是所有的SELECT 命令都能够在数据表变量上操作而且你不能使用SELECT INTO 命令来插入数据到一个数据表变量中去。
你不能在数据表变量上使用一些系统过程,比方sp_depends。数据表变量的对象名在运行时生成,并且是一个随机的名字,它被保存在tempdb数据库里。因为大多数的系统功能和系统过程需要对象名或者标识数值,所以要在一个数据表变量上执行系统功能或者过程是困难的。需要复杂的逻辑来获得对象的名字以及/或者标识数值来运行系统功能和过程。
一个数据表变量的作用域是批处理过程,存储过程或者函数执行的过程。当批处理过程中GO命令被触发了,数据表变量也就出离了它的作用域。
下面是在一个存储过程中使用一个数据表变量的简单脚本。
CREATE PROCEDURE TestName
AS
DECLARE @TableId TABLE
(table_id INT IDENTITY NOT NULL
primary key nonclustered,
id INT NOT NULL,
name sysname NOT NULL
DEFAULT 'UNKNOWN',
type char(2) NOT NULL
DEFAULT '9',
crdate datetime NOT NULL
DEFAULT current_timestamp)
INSERT @TableId (id, name, type, crdate)
SELECT id, 'test_' + name, type, crdate FROM tempdb..sysobjects
SELECT * FROM @TableID
GO
exec TestName
GO