Можете ли вы вызвать запрос из другого запроса? - PullRequest
1 голос
/ 17 июня 2019

В настоящее время у меня есть хранимая процедура, которая выполняет некоторые операторы вставки, вызывает другую хранимую процедуру, которая вставляет что-то еще и возвращает идентификатор, а затем выполняет некоторые операторы обновления.Итак, примерно так:

BEGIN
    SET NO COUNT ON;

    BEGIN TRY
        BEGIN TRAN

        -- Do some inserts

        DECLARE @MyIdCount int = (SELECT COUNT(MyId) FROM MappingTable)
        DECLARE @newId int

        WHILE @MyIdCount > 0
        BEGIN
           EXEC mySproc @parentId = @SomeId, @outId = @newId OUTPUT

           -- update table with result from sproc executed above
           @MyIdCount = @MyIdCount - 1
        END

        -- Do some updates based on the table that's been updated in the while loop

        SELECT * FROM MyUpdatedTable

        END TRAN
    END TRY
    BEGIN CATCH
        -- do something error
    END CATCH
END

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

Вот хранимая процедура в цикле while:

BEGIN
    SET NOCOUNT ON;

    INSERT INTO Mapping(ParentId) 
    VALUES(@parentId)

    SELECT @outId = SCOPE_IDENTITY()
END

@outId определяется как параметр OUTPUT и прекрасно работает при перемещении.чтобы получить доступ к этому:

var parameters = new DynamicParameters();
parameters.Add("@parentId", parentId);
parameters.Add("@outId", dbType: DbType.Int64, direction: ParameterDirection.Output);

// some query logic etc.

return parameters.Get<long>("@outId");  

ОБНОВЛЕНИЕ

Так что я думаю Я должен быть в состоянии сделатьследующее:

using (IDbConnection = Connection)
{
    var transaction = db.BeginTransaction();

    var inputDataParams = new DynamicParameters();
    //add various parameters for the inserts.

    db.Execute(New Input Data query, inputDataParams, transaction);

    var getOldIdsParams = new DynamicParameters():
    //add parameters for gettings old ids for mapping

    var oldIds = db.Query<long>(new query to get ids, getOldIdsParams, transaction).ToList();

    var mapping = new Dictionary<long, long>();

    var createNewIdsParams = new DynamicParameters();
    createNewidsparams.Add("@parentId", parentId);
    createNewidsparams.Add("@outId", , dbType: DbType.Int64, direction: ParameterDirection.Output);

    long newId;

    foreach(var oldId in oldIds)
    {
         db.Execute(Create Id Query, createNewIdsParams, transaction);
         newId = createNewidsparams.Get<long>("@outId");
         mapping.Add(oldId, newId);
    }

    var updateParameters = new DynamicParameters();
    // add params

    foreach(var oldId in oldIds)
    {
        updateParameters.Add(@oldId, oldId);
        updateParameters.Add(@newId, mapping[oldId]);
        db.Execute(New update query, updateParamters, transaction);
    }

    transaction.Commit();
}

Я постараюсь реализовать это полностью и посмотреть, будет ли это работать.Если кто-то может увидеть что-то не так с этим, пожалуйста, скажите!Это сэкономит мне время.Спасибо

ОБНОВЛЕНИЕ 2

Это похоже на работу.

1 Ответ

0 голосов
/ 17 июня 2019

Да, вы можете использовать.Подзапрос, Внутренний запрос или Вложенный запрос - это запрос в другом запросе SQL, который встроен в предложение WHERE.Подзапрос используется для возврата данных, которые будут использоваться в основном запросе в качестве условия для дальнейшего ограничения данных, подлежащих извлечению.Подзапросы могут использоваться с операторами SELECT, INSERT, UPDATE и DELETE вместе с такими операторами, как =, <,>,> =, <=, IN, BETWEEN и т. Д. </p>

Example1:

ВЫБРАТЬ имя столбца [, имя столбца] ИЗ таблицы1 [, таблица2] ГДЕ Имя_ столбца ОПЕРАТОР (ВЫБРАТЬ имя столбца [, имя столбца] ИЗ таблицы1 [, таблица2] [ГДЕ])

Пример2:

ВСТАВИТЬ Вtable_name [(column1 [, column2])] SELECT [* | column1 [, column2] FROM table1 [, table2] [ГДЕ ОПЕРАТОР ЗНАЧЕНИЯ]

Пожалуйста, посетите: https://www.tutorialspoint.com/sql/sql-sub-queries.htm

...