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