只有 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;
我有一个执行多个相关插入语句的存储过程,但我只想 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;