SQL Server не позволяет выполнять подзапрос как динамический SQL

Вы не указали, сколько серверов Вы имеете. Я предположу, что Вы имеете два.

С 2 серверами можно сделать, например, следующее:

  • создайте внешний DNS записи, которые указывают на 2 различных IP-адреса
  • присвойте эти 2 IP-адреса 2 службам кластеров
  • главный узел этих 2 служб кластеров должен быть на различных машинах

Это заботится для дублирования на уровне веб-сервера. Существуют другие решения также, и в зависимости от Ваших потребностей доступности/выравнивания нагрузки можно пропустить части вышеупомянутых 3 шагов.

Относительно MySQL лучшее решение зависит от характеристик чтения-записи приложения. Проверьте документацию MySQL на начальную точку и реализуйте или кластер MySQL или дублируемую базу данных MySQL.

1
задан 15 March 2012 в 15:59
1 ответ

Внутренний запрос 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
1
ответ дан 4 December 2019 в 01:11

Теги

Похожие вопросы