3

このクエリを使用して、すべてのテーブルの行数を取得できます。

    SELECT '[' + SCHEMA_NAME(t.schema_id) + '].[' + t.name + ']' AS fulltable_name, SCHEMA_NAME(t.schema_id) AS schema_name, t.name AS table_name,
    i.rows
    FROM sys.tables AS t INNER JOIN
    sys.sysindexes AS i ON t.object_id = i.id AND i.indid < 2

**AND
t.name.programID = 4**

しかし、programID = n のすべての行をカウントする必要があります。where 句に太字の行を追加すると、次のエラーが発生し続けます。

nvarchar でメソッドを呼び出すことはできません。アンディに感謝します。

4

2 に答える 2

1

あなたの例のテーブル名は、プロパティのようにアクセスできません。これは単なる文字列であり、テーブル自体ではありません。私はあなたのために働くかもしれない解決策を構成しました。少しハックのように感じますが、あなたのやり方を理解してくれます。

DECLARE @Value INT, @Column_Name VARCHAR(MAX)

SELECT @Value = 4, @Column_Name = 'ProgramId'

IF OBJECT_ID(N'tempdb..#Results',N'U') IS NOT NULL
            DROP TABLE #Results

SELECT  '[' + SCHEMA_NAME(t.schema_id) + '].[' + t.name + ']' AS fulltable_name, SCHEMA_NAME(t.schema_id) AS     schema_name, t.name AS table_name,
i.rows [Row_Count]
INTO #Results
FROM sys.tables AS t INNER JOIN
sys.sysindexes AS i ON t.object_id = i.id AND i.indid < 2
INNER JOIN information_schema.COLUMNS  C ON t.name = c.TABLE_NAME AND SCHEMA_NAME(t.schema_id)= c.TABLE_SCHEMA  
WHERE C.COLUMN_NAME = @Column_Name

DECLARE @SQL VARCHAR(MAX)

SELECT @SqL = COALESCE(@SqL +' UNION ',' ')  + 'SELECT '''+ fulltable_name + ''', COUNT(*) FROM ' +     fulltable_name +     ' where ' + @Column_Name + ' = ' + CAST(@Value AS VARCHAR(1000))+ ' GROUP BY ' + @Column_Name     + ' '
FROM #Results

PRINT(@SqL)
EXEC (@SqL)

IF OBJECT_ID(N'tempdb..#Results',N'U') IS NOT NULL
            DROP TABLE #Results
于 2012-09-07T19:41:38.947 に答える
0

DB内のすべてのテーブルに「programID」列がありますか?もしそうなら..これを試してみてください

exec sp_MSforeachtable 'SELECT ''?'' AS TableName,COUNT(*) AS cnt FROM ? WHERE programID = 4'

編集:このクエリは、列「programID」のないテーブルのカウントをスキップします

CREATE TABLE #t (table_name Varchar(500), record_count int)

INSERT INTO #t (table_name,record_count)
exec sp_MSforeachtable '
     IF EXISTS(SELECT * FROM sys.columns WHERE name = ''programID'' 
             and object_id = object_id(''?''))
     EXEC(''SELECT ''''?'''' AS TableName,COUNT(*) AS cnt FROM ? WHERE programID = 4'')'

SELECT * FROM #t
于 2012-09-07T19:51:08.197 に答える