У меня есть довольно простой запрос, который я начал изменять, чтобы удалить временную таблицу, поскольку у нас есть проблемы параллелизма во многих различных системах и клиентах.
В настоящее время простым решением было разбить запрос на:несколько отдельных запросов для репликации того, что SQL делал раньше.
Я пытаюсь найти способ вернуть результат динамического запроса SQL в виде значения столбца.Новый запрос довольно прост, он ищет в системных объектах все таблицы с определенным форматом и выводом.Чего мне не хватает, так это того, что для каждой записи мне нужно вывести результат динамического запроса для каждой из этих таблиц.
Запрос:
SELECT [name] as 'TableName'
FROM SYSOBJECTS WHERE xtype = 'U'
AND (CHARINDEX('_PCT', [name]) <> 0
OR CHARINDEX('_WHT', [name]) <> 0)
Все эти таблицы имеют общий столбецназывается Result
, который является поплавком.То, что я пытаюсь сделать, это вернуть счетчик этого столбца в некотором предложении WHERE
, которое является общим и будет работать со всеми таблицами.
Желаемый запрос (я знаю, что он недействителен) будет:
SELECT [name] as 'TableName',
sp_executesql 'SELECT COUNT(*) FROM ' + [name] + ' WHERE Result > 0 OR (Result < 139 AND CurrentIndex < 15)' as 'ResultValue'
FROM SYSOBJECTS WHERE xtype = 'U'
AND (CHARINDEX('_PCT', [name]) <> 0
OR CHARINDEX('_WHT', [name]) <> 0)
Раньше было легко.У нас была временная таблица с 2 столбцами, и мы сначала заполняли имя таблицы.Затем мы выполняем итерацию для временной таблицы и выполняем динамический sql, возвращаем значение в переменной OUTPUT
и просто обновляем запись временной таблицы и, наконец, возвращаем таблицу.
Я пробовал скалярную функцию, ноон не поддерживает динамический SQL, поэтому он не работает.Я бы предпочел не создавать 13 000 различных запросов для 13 000 таблиц.
Я пытался использовать справочную таблицу и использовать триггер для обновления состояния, но это сильно замедляет работу системы.Средние таблицы вставляют и удаляют 28 миллионов записей.Исходный запрос к временным таблицам выполнялся всего за 5-6 минут из-за очень хорошей индексации, и теперь мы достигаем 25-30 минут.
Есть ли какое-либо другое доступное решение, кроме запроса списка таблиц, чем каждый запрос клиентаТаблица один за другим, чтобы узнать его статус?
Мы используем SQL Server 2017, если сейчас доступны некоторые новые функции