Итак, давайте предположим, что этот запрос дал желаемый результат, т. Е. Список всех возможных тегов в данном наборе таблиц (0_100000
и т. Д.) И столбцы, указывающие, существует ли данный тег в AggregateValue
и TagValueCompressed
:
SELECT '0_100000' AS TableSet
, ISNULL(AggValue.TagUID, TagValue.TagUID) AS TagUID
, IIF(TagValue.TagUID IS NOT NULL, 1, 0) AS ExistsInTag
, IIF(AggValue.TagUID IS NOT NULL, 1, 0) AS ExistsInAgg
FROM (SELECT DISTINCT TagUID FROM tlg.AggregateValue_0_100000) AggValue
FULL OUTER
JOIN (SELECT DISTINCT TagUID FROM TLG.TagValueCompressed_0_100000) TagValue
ON AggValue.TagUID = TagValue.TagUID
Таким образом, чтобы выполнить его для нескольких таблиц, мы можем сделать этот запрос шаблоном:
DECLARE @QueryTemplate NVARCHAR(MAX) = '
SELECT ''$SUFFIX$'' AS TableSet
, ISNULL(AggValue.TagUID, TagValue.TagUID) AS TagUID
, IIF(TagValue.TagUID IS NOT NULL, 1, 0) AS ExistsInTag
, IIF(AggValue.TagUID IS NOT NULL, 1, 0) AS ExistsInAgg
FROM (SELECT DISTINCT TagUID FROM tlg.AggregateValue_$SUFFIX$) AggValue
FULL OUTER
JOIN (SELECT DISTINCT TagUID FROM TLG.TagValueCompressed_$SUFFIX$) TagValue
ON AggValue.TagUID = TagValue.TagUID';
Здесь $SUFFIX$
обозначает 0_100000
и т. Д. Теперь мы можем выполнить этот запрос динамически для всех таблиц, соответствующих определенному шаблону, например, скажем, у вас 500 таких таблиц.
DECLARE @query NVARCHAR(MAX) = ''
-- Produce a query for a given suffix out of the template
-- suffix is the last 8 characters of the table's name
-- combine all the queries, for all tables, using UNION ALL
SELECT @query += CONCAT(REPLACE(@QueryTemplate, '$SUFFIX$', RIGHT(name, 8)), ' UNION ALL ')
FROM sys.tables
WHERE name LIKE 'TagValueCompressed%';
-- Get rid of the trailing UNION ALL
SET @Query = LEFT(@Query, LEN(@Query) - LEN('UNION ALL '));
EXECUTE sp_executesql @Query
Это даст объединенные результаты для всех соответствующих таблиц.
Вот рабочий пример для dbfiddle .