【发布时间】:2021-09-14 17:56:32
【问题描述】:
我有一个这样的对象数组:
[ {User_ID: 1, Source_ID: 1}, {User_ID: 1, Source_ID: 2}]
还有我的访问表设计:
| AccessID | User_ID | Source_ID |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 2 | 2 |
如果我想将 User_ID = 1 的访问记录更新为 [ {User_ID: 1, Source_ID: 1}, {User_ID: 1, Source_ID: 3} ]
如何删除访问记录“User_ID = 1, Source_ID = 2”并插入访问记录“User_ID = 1, Source_ID = 3”,但保留“User_ID = 1, Source_ID = 1”记录。
使用存储过程?
到目前为止我所拥有的:
C#:
...Create the DB Command and add parameter "Source_ID"..
foreach (var SourceID in user.SourceAccess)
{
dBCall1.GetCommand().Parameters["Source_ID"].Value = SourceID;
dBCall1.ExecuteNonQuery;
}
存储过程:
CREATE PROCEDURE [dbo].[UpdateUserSourceAccess]
@UserID INT,
@SourceID INT
AS
IF NOT EXISTS (SELECT 1 FROM [UserSourceAccess] WHERE [User_ID] = @UserID AND Source_ID = @SourceID)
INSERT INTO UserSourceAccess
( UserID, SourceID ) VALUES ( @UserID, @SourceID )
...
【问题讨论】:
-
您如何决定要保留源 1 而不是 2?如果 AccessID 是数组的一部分,您可以轻松地执行 upsert/merge 操作。
-
也许你可以使用
SQL Merge声明。 WHEN 匹配做操作 1 WHEN 不匹配做操作 2 -
Access_ID 不是数组的一部分,它是 Access 表的主键(用于跟踪用户对源的访问)。我希望能够切换用户源访问(一个用户可以有 1 - 多个源访问)
-
在 SQL Server 中,您可以创建临时表并在其中插入数组数据。从该表中,您可以比较记录和删除/插入操作。
-
如果第 3 行和第 4 行不在您的数组中,您会按照什么逻辑保留它们?实际上,您是否有一个需要匹配的
Source_ID列表,但仅适用于单个User_ID?
标签: c# sql-server stored-procedures