查找公共列设置为值的所有数据库表
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
我无法测试,但应该是这样
所有数据库表都有一个 [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
我无法测试,但应该是这样