查找公共列设置为值的所有数据库表

Find all database tables where a common column is set to a value

所有数据库表都有一个 [uniqueidentifier] 类型的 UserId 字段。

我需要查询整个数据库并获取将 UserId 设置为特定值的表的列表。 现在我通过使用游标实现了这一点,结果很糟糕而且难以阅读。我如何改进此查询以检索一个清晰的列表,其中包含表和将 UserId 设置为特定值的记录数,而不是使用此查询:

DECLARE @TableName VARCHAR(127);
DECLARE @Value VARCHAR(512);
DECLARE @SqlCommand varchar(1000)

--Use cursor to loop through database tables that contain UserId column
DECLARE db_cursor CURSOR FOR 
    SELECT t.name AS TableName
    FROM sys.columns c
    JOIN sys.tables t ON c.object_id = t.object_id
    WHERE c.name = 'UserId';
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @TableName;
WHILE @@FETCH_STATUS = 0  
BEGIN  

 --Check if the next table has any UserId matching the where clause
 EXEC('SELECT COUNT(UserId) ,  ''' + @TableName + ''' FROM ' + @TableName + ' WHERE UserId = ''FF13ACCA-022C-4296-AB3D-A35700E35BB3''');


   FETCH NEXT FROM db_cursor INTO @TableName;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;

你完成了所有困难的部分,只需将值放入临时 table 并在你完成后 select 它们。

DECLARE @TableName VARCHAR(127);
DECLARE @Value VARCHAR(512);
DECLARE @SqlCommand varchar(1000)

--Creta temp table
CREATE TABLE #Results (Number int, Tablename sysname)
--Use cursor to loop through database tables that contain UserId column
DECLARE db_cursor CURSOR FOR 
    SELECT t.name AS TableName
    FROM sys.columns c
    JOIN sys.tables t ON c.object_id = t.object_id
    WHERE c.name = 'UserId';
OPEN db_cursor;
FETCH NEXT FROM db_cursor INTO @TableName;
WHILE @@FETCH_STATUS = 0  
BEGIN  

 --Check if the next table has any UserId matching the where clause
 EXEC('INSERT INTO #Results (Number, ''' + @TableName + ''') SELECT COUNT(UserId) ,  ''' + @TableName + ''' FROM ' + @TableName + ' WHERE UserId = ''FF13ACCA-022C-4296-AB3D-A35700E35BB3''');

   FETCH NEXT FROM db_cursor INTO @TableName;
END;
CLOSE db_cursor;
DEALLOCATE db_cursor;

SELECT * FROM #Results
DROP TABLE #Results

我无法测试,但应该是这样