Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 统计所有引用表中对特定行的引用_Sql_Tsql - Fatal编程技术网

Sql 统计所有引用表中对特定行的引用

Sql 统计所有引用表中对特定行的引用,sql,tsql,Sql,Tsql,现在我有了列出所有引用表的代码,这样我就可以逐个计算表中的引用了 问题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.pa

现在我有了列出所有引用表的代码,这样我就可以逐个计算表中的引用了

问题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
等等


可以在一个查询中使用它吗?

我尝试使用sql block语句而不是单个查询来解决它。如果它能解决您的问题,请尝试使用。您也可以为它创建一个存储过程

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

我试图通过使用sql block语句而不是单个查询来解决这个问题。如果它能解决您的问题,请尝试使用。您也可以为它创建一个存储过程

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

这很复杂,取决于你想做什么。我想这些资源可能会帮助你解决你的问题:希望这对你有帮助,这是你在我的帖子中看到的问题1吗?它给出了参考表。但我需要将Query1和以下查询(Query2,Query3…)组合在一个查询中(如果可能的话)。我会看这篇关于子查询的文章:我不清楚REF_TABLE_1等是什么意思。在外部联接、子查询和联合之间,我想是这样的,或者您可以动态构造SQL并使用sp_ExecuteSQL在单个表中获得结果?这相当复杂,而且取决于您想要做什么。我想这些资源可能会帮助你解决你的问题:希望这对你有帮助,这是你在我的帖子中看到的问题1吗?它给出了参考表。但我需要将Query1和以下查询(Query2,Query3…)组合在一个查询中(如果可能的话)。我会看这篇关于子查询的文章:我不清楚REF_TABLE_1等是什么意思。在外部联接、子查询和联合之间,我想是这样的,或者您可以动态构造SQL并使用sp_ExecuteSQL在单个表中获取结果?