2

現在、すべての参照テーブルを一覧表示するコードがあり、テーブルからの参照を1つずつ数えることができます。

クエリ1:

SELECT t.NAME AS TableWithForeignKey,
    c.NAME AS ForeignKeyColumn
FROM sys.foreign_key_columns AS fk
INNER JOIN sys.tables AS t
    ON fk.parent_object_id = t.object_id
INNER JOIN sys.columns AS c
    ON fk.parent_object_id = c.object_id
        AND fk.parent_column_id = c.column_id
WHERE fk.referenced_object_id = (
        SELECT object_id
        FROM sys.tables
        WHERE NAME = 'MAIN_TABLE'
        )

クエリ2:

SELECT COUNT(MAIN_ID)
FROM MAIN_TABLE
INNER JOIN REF_TABLE_1
    ON MAIN_TABLE.ID = REF_TABLE_1.MAIN_ID

クエリ3:

SELECT COUNT(MAIN_ID)
FROM MAIN_TABLE
INNER JOIN REF_TABLE_2
    ON MAIN_TABLE.ID = REF_TABLE_2.MAIN_ID

1つのクエリでそれを行うことは可能ですか?

4

1 に答える 1

0

単一のクエリではなく、SQL ブロック ステートメントを使用して解決しようとしました。問題が解決した場合は、使用してみてください。そのためのストアド プロシージャも作成できます。

BEGIN
    CREATE TABLE #tempTable (TName NVARCHAR(100), FKey NVARCHAR(100), RCount BIGINT)

    INSERT INTO #tempTable(TName, FKey)
    SELECT t.NAME AS TableWithForeignKey, 
        c.NAME AS ForeignKeyColumn 
    FROM sys.foreign_key_columns AS fk 
    INNER JOIN sys.tables AS t 
        ON fk.parent_object_id = t.object_id 
    INNER JOIN sys.columns AS c 
        ON fk.parent_object_id = c.object_id 
            AND fk.parent_column_id = c.column_id 
    WHERE fk.referenced_object_id = ( 
            SELECT object_id 
            FROM sys.tables 
            WHERE NAME = ''MAIN_TABLE' 
            ) 

    SELECT * FROM #tempTable

    DECLARE tempT CURSOR FOR SELECT TName FROM #tempTable

    DECLARE @tn NVARCHAR(100)

    OPEN tempT

    FETCH NEXT FROM tempT INTO @tn

    WHILE @@FETCH_STATUS = 0
    BEGIN
        EXEC (N'UPDATE #tempTable SET RCount = (SELECT COUNT(*) FROM ' + @tn + ') WHERE TName =''' +  @tn + '''')

        FETCH NEXT FROM tempT INTO @tn
    END 
    CLOSE tempT;
    DEALLOCATE tempT;

    SELECT * FROM #tempTable
    DROP TABLE #tempTable

END
于 2012-09-10T04:40:26.533 に答える