首页 > 解决方案 > 您可以从另一个查询中调用查询吗?

问题描述

目前我有一个存储过程,它执行一些插入语句,调用另一个存储过程插入其他内容并返回一个 id,然后执行一些更新语句。所以有点像这样:

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 stored procedure 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参数,当通过访问这个移动到 dapper 时工作正常:

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

这似乎有效。

标签: c#sqldapper

解决方案


是的,您可以使用 . 子查询或内部查询或嵌套查询是另一个 SQL 查询中的查询并嵌入在 WHERE 子句中。子查询用于返回将在主查询中使用的数据,作为进一步限制要检索的数据的条件。子查询可以与 SELECT、INSERT、UPDATE 和 DELETE 语句以及 =、<、>、>=、<=、IN、BETWEEN 等运算符一起使用。

示例 1:

SELECT column_name [, column_name ] FROM table1 [, table2 ] WHERE column_name OPERATOR (SELECT column_name [, column_name ] FROM table1 [, table2 ] [WHERE])

示例 2:

INSERT INTO table_name [ (column1 [, column2 ]) ] SELECT [ *|column1 [, column2 ] FROM table1 [, table2 ] [ WHERE VALUE OPERATOR ]

请访问:https ://www.tutorialspoint.com/sql/sql-sub-queries.htm


推荐阅读