У меня есть база данных SQL Server 2005, в которой хранятся данные для нескольких пользователей.Каждая таблица, которая содержит данные, принадлежащие пользователю, имеет столбец с именем OwnerID
, который идентифицирует владельца;большинство, но не все таблицы имеют этот столбец.
Я хочу иметь возможность подсчитывать количество строк, «принадлежащих» пользователю в каждой таблице.Другими словами, я хочу запрос, который возвращает имена каждой таблицы, которая содержит столбец OwnerID
, и подсчитывает количество строк в каждой таблице, которые соответствуют данному значению OwnerID
.
Я могу вернутьтолько имена соответствующих таблиц, использующих этот запрос:
SELECT OBJECT_NAME(object_id) [Table] FROM sys.columns
WHERE name = 'OwnerID' ORDER BY OBJECT_NAME(object_id);
Этот запрос возвращает список имен таблиц, подобных этому:
+---------+
| Table |
+---------+
| Alpha |
| Beta |
| Gamma |
| ... |
+---------+
Но возможно ли написать запрос, который можеттакже посчитать количество строк в каждой таблице, которые соответствуют данному OwnerID
?т.е.:
+---------+------------+
| Table | RowCount |
+---------+------------+
| Alpha | 2042 |
| Beta | 49 |
| Gamma | 740 |
| ... | ... |
+---------+------------+
Примечание: Список имен таблиц необходимо возвращать динамически, он не подходит для жесткого кодирования имен таблиц в этом запросе.
Редактировать: ответ ...
(Я пока не могу отредактировать ваши ответы, но могу отредактировать свой собственный вопрос, поэтому ставлю его здесь ...)
Damien_The_Unbeliever имел по существу правильный ответ, но SQL Server не допускает конкатенацию строк в операторе exec
, поэтому мне пришлось задать запрос до оператора exec
.Последний запрос выглядит следующим образом:
DECLARE @OwnerID int;
SET @OwnerID = 1;
DECLARE @ForEachSQL varchar(100);
SET @ForEachSQL = 'INSERT INTO #t(TableName,RowsOwned) SELECT ''?'', COUNT(*) FROM ? WHERE OwnerID = ' + CONVERT(varchar(11), @OwnerID);
CREATE TABLE #t(TableName sysname, RowsOwned int);
EXEC sp_MSforeachtable @ForEachSQL,
@whereAnd = 'AND o.id IN (SELECT id FROM syscolumns where name=''OwnerID'')';
SELECT * FROM #t ORDER BY TableName;
DROP TABLE #t;