Сохранять переменные в SQL командах, используя C# и одно соединение - PullRequest
1 голос
/ 05 августа 2020

Так что, может быть, кто-то может указать мне правильное направление.

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

Что я решил сделать, так это разбить запрос, чтобы база данных не зависала.

Короче говоря, есть ли способ сохранить все переменные

Declare @sometable as Table

, поскольку каждый SqlCommand нуждается в информации и идентификаторах из запросов перед ним.

Используется одно и то же соединение. Я занимаюсь этим уже 4 дня, и у меня кружится голова.

Вот часть моего кода, который я пробовал использовать ту же команду и изменить текст запроса

foreach (var query in querys)
{
 command.CommandText = query;
 DataSet ds = new DataSet();
  try {
var reader = command.ExecuteReader();

while (!reader.IsClosed)
ds.Tables.Add().Load(reader);
mergedResults.Add(ds);
 }

EDIT: вот образец верхней части массивного запроса, который необходимо использовать везде, где

DECLARE @dbID int;
DECLARE @idDomain int;
DECLARE @DomainName varchar(255);

DECLARE @IdDrivers TABLE
(
 idDriver int,
 startTime datetime,
 endTime dateTime
);

Ответы [ 2 ]

3 голосов
/ 05 августа 2020

Все, что начинается с @ (локальные переменные, параметры, параметры с табличным значением и т. Д. c), ограничиваются одним пакетом SQL, поэтому нет: они не могут сохраняться между пакетами. Есть - это # временные таблицы, которые привязаны к соединению, но это не похоже на хорошее решение. Замедление не меняет поведения тупиковой ситуации, поскольку семантика блокировки рассчитана на операцию , а не на пакет - если только у вас нет связующей транзакции, и в этом случае это оказывает влияние. В любом случае: количество пакетов не является определяющим фактором.

Если вы получаете тупиковые ситуации, вам необходимо выяснить, как и почему это происходит. Может оказаться, что выполнение некоторых чтений (с последующими обновлениями тех же данных) с помощью UPDLOCK может помочь, если раньше принять монопольные блокировки.

0 голосов
/ 06 августа 2020

Если вы хотите сохранить переменную таблицы в пакетах:

Вместо табличной переменной @IdDrivers вы можете использовать временную таблицу (#IdDrivers). Создайте эту временную таблицу в своем первом пакете.

например:

if object_id('tempdb..#IdDrivers') is not null drop table #IdDrivers

create table #IdDrivers (your required columns here)

Затем ваша вторая партия может заполнить временную таблицу, и последующие партии смогут читать из нее.

Это должно работать, если вы открываете соединение Sql перед первым пакетом и закрываете его после выполнения последнего пакета.

Возможно, вы захотите создать другую таблицу #temp для хранения ваших переменных например: @ idDomain.

Важно, чтобы пакет, который создает временную таблицу, НЕ выполнялся через sp_execute sql за кулисами - в противном случае ваши последующие пакеты не смогут увидеть созданную вами временную таблицу, из-за определения объема работ. например, если вы попытаетесь передать параметры, тогда ADO. NET будет использовать sp_execute sql за кулисами, поэтому не передавайте параметры в sql, который создает временную таблицу.

...