【发布时间】:2014-06-13 03:07:34
【问题描述】:
注意:最高linked question 并不能解决系统存储过程的问题,但已经接近了。在评论者的帮助下,I came to a working answer。
尝试对sp_spaceused 使用如下语句,会引发错误
SELECT * INTO #tblOutput exec sp_spaceused 'Account'
SELECT * FROM #tblOutput
错误:
必须指定要从中选择的表。
和:
对象或列名丢失或为空。对于 SELECT INTO 语句,验证每一列都有一个名称。对于其他语句,请查找空别名。不允许使用定义为 "" 或 [] 的别名。将别名更改为有效名称。
当我完全声明一个表变量时,它按预期工作,所以在我看来,存储过程确实返回了一个实际的表。
CREATE TABLE #tblOutput (
name NVARCHAR(128) NOT NULL,
rows CHAR(11) NOT NULL,
reserved VARCHAR(18) NOT NULL,
data VARCHAR(18) NOT NULL,
index_size VARCHAR(18) NOT NULL,
unused VARCHAR(18) NOT NULL)
INSERT INTO #tblOutput exec sp_spaceused 'Response'
SELECT * FROM #tblOutput
为什么不能使用结果集为EXECUTE sp_xxx 的临时表或表变量?或者:是否存在比每次都预定义完整表更紧凑的表达式?
(顺便说一句,题外话,Googling for the exact term SELECT * INTO #tmp exec sp_spaceused 在撰写本文时,只返回了一个结果)
【问题讨论】:
-
DECLARE @tblOutputTableSTOP doing this,使用临时表。 -
@Kermit:好的,但是临时表或表变量,在这两种情况下(在本例中)都需要我预定义表。此外,对于非常小的结果集或暂存器查询,I don't really see the difference(并且第一个示例无论如何都使用临时表;)
-
@Abel 周六刚刚完成了 SQL。 Brent Ozar 证明表变量的统计数据不准确,应避免使用表变量。
-
@DanielE.: 解决方案终于找到了,见stackoverflow.com/a/23327256/111575。感谢您的帮助!
标签: sql-server tsql stored-procedures table-variable