Мое предложение:
- Прежде всего таблица макетов для имитации вашей проблемы с системными представлениями
DECLARE @tbl TABLE(YourView VARCHAR(100));
INSERT INTO @tbl VALUES('[INFORMATION_SCHEMA].[COLUMNS]')
,('sys.objects');
- Теперь мы используем динамическое генерирование SQL
DECLARE @cmd VARCHAR(MAX)=
(
SELECT 'SELECT SUM(CountOfRows) FROM ('
+ STUFF(
(
SELECT ' UNION ALL SELECT COUNT(1) FROM ' + t.YourView
FROM @tbl t
FOR XML PATH('')
),1,10,'')
+ ') t(CountOfRows)'
);
- И выполнить эту команду
EXEC(@cmd);
Результатом является единственное значение, суммирующее все числа строк
Идея вкратце:
Мы создаем следующее утверждение:
SELECT SUM(CountOfRows)
FROM (SELECT COUNT(1)
FROM [INFORMATION_SCHEMA].[COLUMNS]
UNION ALL
SELECT COUNT(1)
FROM sys.objects) t(CountOfRows)
Это утверждение будет состоять из всех имен запросов, которые есть в вашей таблице. Конечным результатом является сумма всех строк.
Вы редактировали свой вопрос ...
Это может приблизиться к вашим потребностям, идея та же:
DECLARE @cmd VARCHAR(MAX)=
STUFF(
(
SELECT ' UNION ALL SELECT ''' + t.YourView + ''' AS ViewName,COUNT(1) AS CountOfRows FROM ' + t.YourView
FROM @tbl t
FOR XML PATH('')
),1,10,'');
EXEC(@cmd);
Результат
ViewName CountOfRows
[INFORMATION_SCHEMA].[COLUMNS] 171
sys.objects 161
ОБНОВЛЕНИЕ: обработать результат в виде таблицы
Вы можете использовать любую существующую таблицу или табличную переменную с синтаксисом INSERT INTO Target(<ColList>) EXEC(<statement>)
:
DECLARE @tbl TABLE(YourView VARCHAR(100));
INSERT INTO @tbl VALUES('[INFORMATION_SCHEMA].[COLUMNS]')
,('sys.objects');
DECLARE @cmd VARCHAR(MAX)=
STUFF(
(
SELECT ' UNION ALL SELECT ''' + t.YourView + ''' AS ViewName,COUNT(1) AS CountOfRows FROM ' + t.YourView
FROM @tbl t
FOR XML PATH('')
),1,10,'');
--Here I use a declared table variable
DECLARE @targetTable TABLE(ViewName VARCHAR(100),CountOfRows INT);
INSERT INTO @targetTable(ViewName,CountOfRows)
EXEC(@cmd);
--we read the result from this table
SELECT * FROM @targetTable;