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

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 ''?'''

もう 1 つのオプションはsp_spaceused、一度に 1 つのテーブルを処理するのではなく、ソース コードを表示して、テーブルのリストに対して結合する独自のクエリを作成することです。

于 2012-06-14T18:59:57.440 に答える
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 に答える