t-sql - 将 EXEC 的结果处理到 OUTER APPLY 中

标签 t-sql 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.

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

最佳答案

我建议不要使用 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 中的源代码并编写您自己的查询,该查询连接表列表,而不是一次处理一个表。

关于t-sql - 将 EXEC 的结果处理到 OUTER APPLY 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11035453/

相关文章:

mysql - 如何在mysql中的一列但不同行中插入相同的记录?

sql - 如何删除主表中与临时表中的 ID 匹配的行?

sql - 使用指南克隆树结构

javascript - 内爆阵列未按预期工作

php - 连接多个表但不是全部

mysql - 如何最大限度地减少这些子查询的使用并提高性能?

PHP 会跳过检查并插入数据,即使数据已经存在

php - INSERT mysql_num_rows 作为变量

sql - 我应该如何将这些数据迁移到这些 Sql Server 表中?

c# - 如何根据 SQL 语法在给定元数据信息和解析树的情况下确定 SQL 语句中的列属于哪个表?