Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用存储过程加载用户提取_Sql Server_Asp.net Mvc 3_Tsql_Stored Procedures - Fatal编程技术网

Sql server 使用存储过程加载用户提取

Sql server 使用存储过程加载用户提取,sql-server,asp.net-mvc-3,tsql,stored-procedures,Sql Server,Asp.net Mvc 3,Tsql,Stored Procedures,我有一个ASP MVC web应用程序,需要它每天从文件中加载一个用户摘录。数据库中的用户应相应更新:如果不在源中,则删除;如果在源和目标中,则更新;如果仅在源中,则创建。在执行此操作时,某些权限也应自动授予用户。如果有任何错误,什么也不应该发生 首先,我尝试使用Entity Framework执行此操作,但是SaveChanges调用需要大约两分钟的时间才能返回,这对于相对较少的用户(约140000)来说是非常多的 我现在的想法是编写一个执行更新的存储过程。我会将新用户列表作为参数传递。我的临

我有一个ASP MVC web应用程序,需要它每天从文件中加载一个用户摘录。数据库中的用户应相应更新:如果不在源中,则删除;如果在源和目标中,则更新;如果仅在源中,则创建。在执行此操作时,某些权限也应自动授予用户。如果有任何错误,什么也不应该发生

首先,我尝试使用Entity Framework执行此操作,但是SaveChanges调用需要大约两分钟的时间才能返回,这对于相对较少的用户(约140000)来说是非常多的

我现在的想法是编写一个执行更新的存储过程。我会将新用户列表作为参数传递。我的临时表的类型:

CREATE TYPE [dbo].[TempUserType] AS TABLE 
(
    [Uid] NVARCHAR(80) NOT NULL PRIMARY KEY,
    [GivenName] NVARCHAR(80) NOT NULL,
    [FamilyName] NVARCHAR(80) NOT NULL,
    [Email] NVARCHAR(256) NOT NULL,
    [GiveRight1] BIT NOT NULL,
    [GiveRight2] BIT NOT NULL,
    [GiveRight3] BIT NOT NULL
)
用户:

CREATE TABLE [dbo].[User] (
    [Id]          INT            IDENTITY (1, 1) NOT NULL,
    [Uid]         NVARCHAR (80)  NOT NULL,
    [GivenName]   NVARCHAR (80)  NOT NULL,
    [FamilyName]  NVARCHAR (80)  NOT NULL,
    [Email]       NVARCHAR (256) NOT NULL,
    PRIMARY KEY CLUSTERED ([Id] ASC),
    UNIQUE NONCLUSTERED ([Uid] ASC)
);
用户角色:

CREATE TABLE [dbo].[UserRole] (
    [UserId]      INT NOT NULL,
    [RoleId] INT NOT NULL,
    CONSTRAINT [PK_UserRole] PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC),
    CONSTRAINT [FK_UserRole_User] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User] ([Id]),
    CONSTRAINT [FK_UserRole_Role] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[Role] ([Id])
);
我一直在写的程序是:

CREATE PROCEDURE [dbo].[UpdateUsers]
    @extractedUsers TempUserType READONLY
AS

BEGIN TRANSACTION

MERGE
    [dbo].[User] AS trg
USING
    @extractedUsers AS src
ON
    (trg.[Uid] = src.[Uid])
WHEN MATCHED THEN
    UPDATE SET
        trg.GivenName = src.GivenName,
        trg.FamilyName = src.FamilyName,
        trg.Email = src.Email
WHEN NOT MATCHED BY TARGET THEN
    INSERT
        ([Uid], GivenName, FamilyName, Email)
    VALUES
        (src.[Uid], src.GivenName, src.FamilyName, src.Email)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;


COMMIT TRANSACTION
我的问题:在这种情况下,使用带有merge的程序是否适合实现EF的性能改进?如何根据源表中的3个布尔值为角色赋予属性


角色可以进行编码,这意味着我知道右边的1对应于角色ID 1,右边的2对应于角色ID 2,右边的3对应于角色ID 3。

阅读完问题后,我想留下解决方案的想法。 对我来说,使用IF/ELSE调用更新或插入更有意义,而不是使用合并,因为您需要更新/插入的用户ID来添加其角色权限

您可以检查UId是否存在,如果存在,则更新用户详细信息,如果不存在,则创建并保留新的标识值

在这两种情况下,当使用用户ID时,根据带有IF语句的布尔值添加相应的权限

伪代码:

If UserId exists in UsersTable
   Update
   Store UserId
Else
   Insert
   Store created UserId (using the @@IDENTITY)

If bool1 add permission 1
If bool3 add permission 2
If bool3 add permission 3

你不能使用if-else-if吗?你的意思是在merge语句中使用if-else-if吗?或者你的意思是写过程而不合并?写storproc而不合并,只是使用if-else ifUpvote问一个好问题!好风格!不幸的是,我现在没有时间回答;(