创建表变量的语法和创建表的相似,不同的是使用DECLARE关键字,并且表名有@符号前缀:
- DECLARE @TableName TABLE
- (column_name <data_type> [ NULL | NOT NULL ] [ ,...n ] )
在这个示例中,使用表变量的方式和前面技巧中使用临时表的方式相似。这个示例演示实现的不同(包括不显式地DROP表的方法):
- DECLARE @ProductCostStatistics TABLE
- ( ProductID int NOT NULL PRIMARY KEY,
- AvgStandardCost money NOT NULL,
- ProductCount int NOT NULL)
- INSERT @ProductCostStatistics
- (ProductID, AvgStandardCost, ProductCount)
- SELECT ProductID,
- AVG(StandardCost) AvgStandardCost,
- COUNT(ProductID) Rowcnt
- FROM Production.ProductCostHistory
- GROUP BY ProductID
- SELECT TOP 3 *
- FROM @ProductCostStatistics
- ORDER BY ProductCount
这个查询返回:
- ProductID AvgStandardCost ProductCount
- 710 3.3963 1
- 709 3.3963 1
- 731 352.1394 1
解析
这个技巧使用表变量的方式和前面技巧使用临时表的方式基本一样。不过,两个技巧还是有重要区别的。
首先,这次的表变量使用DECLARFE @ Tablename TABLE而不是CREATE TABLE来定义。其次,和临时表技巧不同,该技巧在每个语句后面没有GO,因为临时表只能在批处理、存储过程或函数中存在。
在技巧的后面一部分中,像使用普通表一样从表变量插入和查询,不同的是这次使用@tablename格式:
- INSERT @ProductCostStatistics
- ...
- SELECT TOP 3 *
- FROM @ProductCostStatistics
- ...
在示例的最后并不需要使用DROP TABLE,因为在批处理/存储过程/函数执行后表变量就从内存中消失了。