【发布时间】: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
【问题讨论】:
-
是的,你可以做到:使用系统表:blog.sqlauthority.com/2007/09/04/… 和一个简单的选择语句
-
感谢您询问如何“没有光标”地做某事。 !
标签: sql sql-server