Выполнение динамического SQL с возвращаемым значением в качестве значения столбца для каждой строки - PullRequest
0 голосов
/ 24 мая 2019

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

В настоящее время простым решением было разбить запрос на:несколько отдельных запросов для репликации того, что 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, если сейчас доступны некоторые новые функции

1 Ответ

1 голос
/ 24 мая 2019

Вы можете использовать этот сценарий для своих целей (протестировано в SQL Server 2016).

Обновлено: Теперь он должен работать, поскольку результаты теперь представляют собой единый набор.

EXEC sp_msforeachtable
@precommand = 'CREATE TABLE ##Statistics 
    (TableName varchar(128) NOT NULL, 
    NumOfRows int)',
@command1 ='INSERT INTO ##Statistics (TableName, NumOfRows)
    SELECT ''?'' Table_Name, COUNT(*) Row_Count FROM ? WHERE Result > 0 OR (Result < 139 AND CurrentIndex < 15)',
@postcommand = 'SELECT TableName, NumOfRows FROM ##Statistics;
    DROP TABLE ##Statistics'
,@whereand = ' And Object_id In (Select Object_id From sys.objects
    Where name like ''%_PCT%'' OR name like ''%_WHT%'')'

Для получения более подробной информации о sp_msforeachtable Пожалуйста, посетите эту ссылку

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