Получить счетчик от всех запросов в списке запросов - PullRequest
1 голос
/ 12 июня 2019

У меня есть куча запросов "Проверить", у которых все должно иметь количество 0, если все правильно. Теперь я хочу создать один запрос, чтобы суммировать все значения этих запросов в одном списке.

Пример:

QueriesToCheck (Table with one column)
- MissingValues 
- MissingGroup  
- Ais0         

Note: MissingValues (0 rows), MissingGroup (1 row), Ais0 (0 rows) are existing queries in the DB

Expected Output (Query with two columns): 
QueryName            Count
- MissingValues      0
- MissingGroup       1
- Ais0               0

Note: This is a query using the QueriesToCheck table

Может кто-нибудь подсказать, как начать?

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Мое предложение:

- Прежде всего таблица макетов для имитации вашей проблемы с системными представлениями

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;
0 голосов
/ 12 июня 2019

Вы можете сделать это следующим образом

    declare @mytab as table(query nvarchar(max),mytable nvarchar(200),query_count int)
declare @myquery as nvarchar(max)
declare @mycount as int

--Put here the queries you want to check, replace/add Table1,Table2,Table3 by your own tables

insert into @mytab (query,mytable) values
('select @mycount=count(1) from TABLE1','TABLE1'),
('select @mycount=count(1) from TABLE2','TABLE2'),
('select @mycount=count(1) from TABLE3','TABLE3')


declare cursor_count  cursor for select query from @mytab

open cursor_count
fetch cursor_count into @myquery

while @@fetch_status=0
begin
execute sp_executesql 
    @myquery, 
    N'@mycount varchar(max) OUTPUT', 
    @mycount = @mycount output;
update @mytab set query_count=@mycount where query=@myquery;


fetch cursor_count into @myquery
end

close cursor_count

deallocate cursor_count

select mytable,query_count[count] from @mytab
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...