Перебирайте разные таблицы для подсчета - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть таблица с тысячами записей. Обычно 100 000-200 записей. В этой таблице есть поле (MATCH_ID). Я должен получить счет этого идентификатора из 100 различных таблиц, чье значение поля (TABLE_ID) совпадает с MATCH_ID.

Я думаю, что реализация этого с использованием курсоров была бы плохой идеей. Как мне добиться этого с лучшей производительностью.

1 Ответ

0 голосов
/ 02 ноября 2019

Это делает пару предположений, но вы можете создать динамический запрос UNION ALL;который будет намного быстрее чем CURSOR:

DECLARE @MatchID int; --Guessed data type; will need a value

DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13) + NCHAR(10);

SET @SQL = STUFF((SELECT @CRLF +
                         N'UNION ALL' + @CRLF +
                         N'SELECT N' + QUOTENAME(s.[name],'''') + N' AS SchemaName,' + @CRLF +
                         N'       N' + QUOTENAME(t.[name],'''') + N' AS TableName,' + @CRLF +
                         N'       COUNT(*) AS RowCount' + @CRLF +
                         N'FROM ' + QUOTENAME(s.[name]) + N'.' + QUOTENAME(t.[name]) + @CRLF +
                         N'WHERE MATCH_ID = @MatchID'
                  FROM sys.schemas s
                       JOIN sys.tables t ON s.schema_id = t.schema_id
                       JOIN sys.columns c ON t.object_id = c.object_id
                  WHERE c.[name] = N'MATCH_ID'
                  ORDER BY t.[name]
                  FOR XML PATH(N''),TYPE).value('.','nvarchar(MAX)'),1,13,N'') + N';';

--SELECT @SQL; --Your best friend

EXEC sp_executesql @SQL, N'@MatchID int', @MatchID;

Поскольку я не могу это проверить, используйте своего «лучшего друга», если у вас есть какие-либо синтаксические ошибки, или вы не совсем получаетеожидаемых результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...