只有 return @@ROWCOUNT of 1 来自具有多个更新命令的存储过程的更新命令

Only return @@ROWCOUNT of 1 update command from stored procedure with multiple update commands

我有一个执行多个相关插入语句的存储过程,但我只想 return 插入到 dbo.UserTags table 中的行数。

INSERT INTO dbo.UserTag(Tag)
    SELECT DISTINCT Tag 
    FROM @UsersTagsWorking
    WHERE Tag NOT IN (SELECT Tag FROM dbo.UserTag)

INSERT INTO dbo.UserUserTag(UserID, UserTagID)
    SELECT DISTINCT T.UserID, U.TagID 
    FROM @UsersTagsWorking T
    INNER JOIN dbo.UserTag U ON U.Tag = T.Tag
    WHERE T.UserID NOT IN (SELECT UserID FROM DBO.UserUserTag)

我正在使用 Dapper 的 ExecuteAsync 方法来执行存储过程。

connection.ExecuteAsync("dbo.usp_InsertUsersTags", param, commandType: CommandType.StoredProcedure);

param 是使用 SQL 用户定义字段创建的。

var param = new
{
    usersTags = usersTagsDT.AsTableValuedParameter("UsersTagsUDT")                    
};

有没有什么方法可以用 Execute/ExecuteAsync 实现这个,或者我是否必须更改为 Query 之类的东西,然后通过存储 return 计数@@ROWCOUNT 在变量中

SELECT @InsertedTagCount = @@ROWCOUNT

谢谢

感谢@Larnu 在评论中提出的建议。

要关闭循环,这里是解决方案。

存储过程声明

ALTER PROCEDURE [dbo].[usp_InsertUsersTags]
(
    @UsersTags UsersTagsUDT READONLY,
    @InsertedTagCount INT OUTPUT
)

填充输出变量

INSERT INTO dbo.UserTag(Tag)
SELECT DISTINCT Tag FROM @UsersTagsWorking
WHERE Tag NOT IN (SELECT Tag FROM dbo.UserTag)

SELECT @InsertedTagCount = @@ROWCOUNT   

INSERT INTO dbo.UserUserTag(UserID, UserTagID)
SELECT DISTINCT T.UserID, U.TagID FROM @UsersTagsWorking T
INNER JOIN dbo.UserTag U ON U.Tag = T.Tag
WHERE T.UserID NOT IN (SELECT UserID FROM DBO.UserUserTag)

C# Dapper 代码

var param = new DynamicParameters();
param.Add("@InsertedTagCount", 0, DbType.Int32, ParameterDirection.Output);
param.Add("@UsersTags", usersTagsDT.AsTableValuedParameter("UsersTagsUDT"));
                
await connection.ExecuteAsync("dbo.usp_InsertUsersTags", param, commandType: CommandType.StoredProcedure);

int insertedTagCount = param.Get<int>("@InsertedTagCount");

return insertedTagCount;