使用EXEC的结果进行外部应用

时间:2012-06-14 14:37:54

标签: tsql join insert exec apply

我有以下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.

我已经双重检查了插入列表与结果集的匹配,即使按名称也是如此,但我仍然得到相同的错误。有什么想法吗?

2 个答案:

答案 0 :(得分: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.

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

答案 1 :(得分: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中查看源代码并编写自己的查询,该查询连接到表列表而不是一次处理一个表。