【问题标题】:Return a count of all foreign keys across all tables in database without a cursor在没有游标的情况下返回数据库中所有表中所有外键的计数
【发布时间】:2015-02-25 20:44:55
【问题描述】:

在给定表名、列名和 id 的情况下,我需要返回数据库中所有表中特定外键的计数。

因此,如果传入的参数是 TableName、ColumnName、RecordID,我需要查看所有将该列作为外键的表,并返回所有匹配的 RecordID 的计数。

我可以看到如何使用游标和动态 sql 来完成,但我想弄清楚一些更优雅的东西。

我想我真的只是需要比我更聪明的人告诉我你能做到还是不能做到。

编辑

输出应该类似于:
OtherTable 中 ID 1 的计数为 5
OtherTable2 中 ID 1 的计数为 10

因此您可以传入任何表名和记录 ID,并让它返回每个引用表的计数

编辑 2. 我认为应该有比这更好的答案,但这就是我想出的。它确实使用动态 sql,但至少没有游标。 (它使用冒险作品)

DECLARE @RecID AS INT = 1
DECLARE @TableName AS VARCHAR(255) = 'Product'

CREATE TABLE #temp
  (
     tablename   VARCHAR(255),
     ColumnName  VARCHAR(255),
     sqlStatment VARCHAR(max),
     IDCount     INT
  )

INSERT INTO #temp
            (tablename,
             ColumnName,
             sqlStatment)
SELECT Object_schema_name(f.parent_object_id)
       + '.' + Object_name(f.parent_object_id)            AS TableName,
       Col_name(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
       'update #Temp set IDCount = (select count(*) from '
       + Object_schema_name(f.parent_object_id)
       + '.' + Object_name(f.parent_object_id)
       + ' where '
       + Col_name(fc.parent_object_id, fc.parent_column_id)
       + ' = ' + CONVERT(VARCHAR, @RecID)
       + ') where tablename = '''
       + Object_schema_name(f.parent_object_id)
       + '.' + Object_name(f.parent_object_id) + ''';'
FROM   sys.foreign_keys AS f
       INNER JOIN sys.foreign_key_columns AS fc
               ON f.OBJECT_ID = fc.constraint_object_id
WHERE  Object_name(f.referenced_object_id) = @TableName

DECLARE @sql AS VARCHAR(max) = ''

SELECT @sql = @Sql + sqlStatment
FROM   #temp

EXEC (@sql)

SELECT *
FROM   #temp

DROP TABLE #temp 

【问题讨论】:

标签: sql sql-server


【解决方案1】:

我想这就是你想要的:

SELECT COUNT(*)
FROM sys.foreign_key_columns AS fk
JOIN sys.tables AS t ON fk.parent_object_id = t.object_id
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 = 'TableThatContainsTheKey');

【讨论】:

  • 超级接近。我认为它会给我我需要的东西。我添加了一个编辑来显示输出应该是什么。
  • 将您的答案标记为答案,因为您将我引导到正确的位置。
【解决方案2】:

我希望这会有所帮助:

use yourdatabase
select count(*) from sysobjects where xtype='F'

(编辑:抱歉,我的意思是“F”。“PK”用于主键。)

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    • 2011-07-01
    • 2012-07-21
    • 1970-01-01
    相关资源
    最近更新 更多