2

我有以下 TSQL,我试图在其中有意义地提供数据库中哪些表占用最多空间的详细信息。就其本身而言,我可以使用类似的东西;

INSERT INTO #Data
   EXEC sp_spaceused N'tableNameHere'

这工作文件。但是,将其扩展为返回所有表的信息是有问题的。编码;

CREATE TABLE #Data
(
    tableName varchar(100),
    numberofRows varchar(100),
    reservedSize varchar(50),
    dataSize varchar(50),
    indexSize varchar(50),
    unusedSize varchar(50)
)
SELECT so.name, sp.*
    FROM dbo.sysobjects so
    OUTER APPLY (INSERT INTO #Data 
                    OUTPUT inserted.tableName, 
                           inserted.numberofRows,
                           inserted.reservedSize,
                           inserted.dataSize,
                           inserted.indexSize,
                           inserted.unusedSize
                    EXEC sp_spaceused name
                ) sp
    WHERE OBJECTPROPERTY(so.id, N'IsUserTable') = 1
    ORDER BY sp.dataSize DESC, sp.indexSize DESC

    DROP TABLE #Data

但这会导致以下错误;

Msg 120, Level 15, State 1, Line 19
The select list for the INSERT statement contains fewer items than the insert list. The number of SELECT values must match the number of INSERT columns.

我已经两次和三次检查插入列表是否与结果集匹配,即使按名称,但我仍然得到相同的错误。有任何想法吗?

4

2 回答 2

1

我会说这可能是一个误导性的错误信息。我从来没有想过使用 OUTPUT 做 INSERT...EXEC 作为子查询,使用结果并将它们用于以后。不幸的是,当我尝试这个时,稍作修改,例如:

CREATE TABLE #Data
(
    tableName varchar(100),
    numberofRows varchar(100),
    reservedSize varchar(50),
    dataSize varchar(50),
    indexSize varchar(50),
    unusedSize varchar(50)
)

INSERT #Data
OUTPUT inserted.tableName, 
       inserted.numberofRows,
       inserted.reservedSize,
       inserted.dataSize,
       inserted.indexSize,
       inserted.unusedSize
exec sp_spaceused N'tblLeave'

DROP TABLE #Data

我收到了这个错误:

Msg 483, Level 16, State 2, Line 20 The OUTPUT clause cannot be used in an INSERT...EXEC statement.

我有一种感觉,这就是为什么这种语法不适合你的部分原因。

于 2012-06-14T18:41:33.750 回答
1

我建议不要使用 OUTER APPLY:

CREATE TABLE #Data
(
    tableName varchar(100),
    numberofRows varchar(100),
    reservedSize varchar(50),
    dataSize varchar(50),
    indexSize varchar(50),
    unusedSize varchar(50)
)

INSERT #Data
EXEC sp_msforeachtable 'sp_spaceused ''?'''

另一种选择是查看源代码sp_spaceused并编写自己的查询,该查询与表列表连接,而不是一次处理一个表。

于 2012-06-14T18:59:57.440 回答