c# - 您可以从另一个查询中调用查询吗?
问题描述
目前我有一个存储过程,它执行一些插入语句,调用另一个存储过程插入其他内容并返回一个 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
这似乎有效。
解决方案
是的,您可以使用 . 子查询或内部查询或嵌套查询是另一个 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 ]