Вы не указали, сколько серверов Вы имеете. Я предположу, что Вы имеете два.
С 2 серверами можно сделать, например, следующее:
Это заботится для дублирования на уровне веб-сервера. Существуют другие решения также, и в зависимости от Ваших потребностей доступности/выравнивания нагрузки можно пропустить части вышеупомянутых 3 шагов.
Относительно MySQL лучшее решение зависит от характеристик чтения-записи приложения. Проверьте документацию MySQL на начальную точку и реализуйте или кластер MySQL или дублируемую базу данных MySQL.
Внутренний запрос select Id from @tmp
не будет создавать для вас динамический список идентификаторов в этом случае. Вы работаете с разными прицелами. Вам нужно что-то, что создаст для вас этот список идентификаторов, а затем объединит этот список с остальной частью вашего динамического создания SQL.
Это работает в вашем статическом случае, потому что внутренний запрос находится в той же области, что и остальная часть вашего SQL .
Вы можете обойти это, изменив @tmp на временную таблицу вместо табличной переменной и удалив конкатенацию.
DECLARE @UserId VARCHAR(10) = 72;
CREATE TABLE #tmp ( Id VARCHAR(10));
INSERT #tmp exec [dbo].[GetAllSubExecutorsByUserId] @Source = @UserId;
DECLARE @SQL VARCHAR(max);
SELECT @SQL = 'SELECT * FROM tasks ';
SELECT @SQL = @SQL + 'WHERE Executor IN (select Id from #tmp)';
EXEC(@SQL);
DROP TABLE #tmp
Это перемещает область временной таблицы и позволяет вам сгенерировать один оператор SQL для выполнения вашего запроса , независимо от того, сколько записей в таблице.
Вы также можете уйти от динамического SQL, сделав это.
DECLARE @UserId VARCHAR(10) = 72;
CREATE TABLE #tmp ( Id VARCHAR(10));
INSERT #tmp exec [dbo].[GetAllSubExecutorsByUserId] @Source = @UserId;
SELECT * FROM tasks WHERE Executor IN (select Id from #tmp)
DROP TABLE #tmp