2016-11-14 5 views
2

sp_spaceusedを呼び出して、監視したい特定のテーブルの行数を取得しようとしていますが、カーソルの使用を避けようとしています。特定のテーブルでsp_spaceusedを使用するにはどうすればよいですか?

私は私が監視するすべてのテーブルを保持する表を作りました:

CREATE TABLE MonitoredTable 
(
    MonitoredTableID INT PRIMARY KEY IDENTITY(1, 1) NOT NULL 
    , DatabaseName NVARCHAR(128) NOT NULL 
    , SchemaName NVARCHAR(128) NOT NULL 
    , TableName NVARCHAR(128) NOT NULL 
    , RowNumberThreshold INT NOT NULL 
    , IsActive BIT NOT NULL 
) 

私の問題がある:私はだけが彼らの行数テーブルに対してMonitoredTableID秒を返す関数を作成したいです定義されたRowNumberThresholdを超えている。

はここで、私がやりたいものだが、これは無効なSQLです:

CREATE FUNCTION dbo.GetTablesLargerThanThreshold() 
RETURNS @tablesLargerThanThreshold TABLE 
(
    MonitoredTableID INT NOT NULL 
) 
AS 
BEGIN 
    INSERT INTO @tablesLargerThanThreshold 
    SELECT MonitoredTableID 
    FROM MonitoredTable 
    WHERE IsActive = 1 
     AND (SELECT [rows] FROM (EXEC sp_spaceused DatabaseName + '.' + SchemaName + '.' + TableName)) > RowNumberThreshold 

    RETURN 
END 

MonitoredTablerowsの数が定義されたよりも大きい場合、私がチェックすることができる方法はありますRowNumberThresholdカーソルに頼らずに?

答えて

1

これは何か?

-- See the following pages for documentation on the tables used in this query: 
-- 
-- sys.indexes    https://msdn.microsoft.com/en-us/library/ms173760.aspx 
-- sys.partitions   https://msdn.microsoft.com/en-us/library/ms175012.aspx 
-- sys.allocation_units  https://msdn.microsoft.com/en-us/library/ms189792.aspx 
-- sys.tables    Only columns inherited from sys.object, see link below 
-- sys.object    https://msdn.microsoft.com/en-us/library/ms190324.aspx 
SELECT OBJECT_NAME(i.OBJECT_ID) AS [TableName] 
    , p.[rows] AS [Num_Rows] 
FROM sys.indexes AS i 
    INNER JOIN sys.partitions AS p 
     ON p.OBJECT_ID = i.OBJECT_ID 
     AND p.index_id = i.index_id 
    INNER JOIN sys.allocation_units AS a 
     ON a.container_id = p.partition_id 
    INNER JOIN sys.tables AS t 
     ON i.OBJECT_ID = t.OBJECT_ID 
WHERE i.type <= 1 -- Heap or clustered index 
    AND a.type = 1 -- In-row data 
    AND t.type = 'U' -- User-defined table 
    AND t.is_ms_shipped = 0 -- sys.object was not created by an internal SQL Server component 
+0

これは私が必要としているものよりもわずかです(私は、sp_spaceusedストアドプロシージャの行数だけ必要です)。あなたの答えを私が使ったものに合わせて編集しました。私の注意が理にかなっているかどうかを確認し、質問を正しく使用しているかどうかを見てください。答えをありがとう! –

+1

私は今日または明日後にいつか見ていきます。お役に立てて嬉しいです。 –

関連する問題