Sql server 我的存储过程有什么问题?请
这是我的存储过程:Sql server 我的存储过程有什么问题?请,sql-server,stored-procedures,Sql Server,Stored Procedures,这是我的存储过程: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[PROC_AgregarUsuario] @Email VARCHAR(100), @SALT VARCHAR(100), @PASS VARCHAR(100), @PASSWORDECRYPT VARCHAR(100), @Nuevo INT AS BEGIN DECLA
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[PROC_AgregarUsuario]
@Email VARCHAR(100),
@SALT VARCHAR(100),
@PASS VARCHAR(100),
@PASSWORDECRYPT VARCHAR(100),
@Nuevo INT
AS
BEGIN
DECLARE @USERID UNIQUEIDENTIFIER,
@MensajeRegreso VARCHAR(8000),
@CantidadContactosEmpresa INT,
@EmpresaRFC char(13)
SET @USERID = (SELECT [UserId]
FROM [dbo].[aspnet_Users]
WHERE [UserName] = @Email)
IF @Nuevo IN (1, 2)
BEGIN
SET @CantidadContactosEmpresa =
(SELECT COUNT(*)
FROM [dbo].[EmpresaUser]
WHERE [EmpresaUser_Empresa] IN (SELECT [EmpresaUser_Empresa]
FROM [dbo].[EmpresaUser]
WHERE [EmpresaUser_Email] = @Email))
IF @USERID IS NULL
BEGIN
INSERT INTO dbo.aspnet_Users(ApplicationId, UserId, UserName, LoweredUserName,
MobileAlias, IsAnonymous, LastActivityDate)
SELECT TOP 1
ApplicationId, -- ApplicationId - uniqueidentifier
NEWID() , -- UserId - uniqueidentifier
@Email , -- UserName - nvarchar(256)
LOWER(@Email) , -- LoweredUserName - nvarchar(256)
NULL , -- MobileAlias - nvarchar(16)
0 , -- IsAnonymous - bit
GETDATE() -- LastActivityDate - datetime
FROM
dbo.aspnet_Applications
SET @USERID = (SELECT UserId FROM dbo.aspnet_Users
WHERE UserName = @Email)
INSERT INTO dbo.aspnet_Membership (ApplicationId, UserId, Password, PasswordFormat, PasswordSalt,
MobilePIN, Email, LoweredEmail,
PasswordQuestion, PasswordAnswer,
IsApproved, IsLockedOut,
CreateDate, LastLoginDate,
LastPasswordChangedDate,
LastLockoutDate,
FailedPasswordAttemptCount ,
FailedPasswordAttemptWindowStart,
FailedPasswordAnswerAttemptCount,
FailedPasswordAnswerAttemptWindowStart,
Comment)
SELECT
ApplicationId , -- ApplicationId - uniqueidentifier
@USERID , -- UserId - uniqueidentifier
@PASSWORDECRYPT , -- Password - nvarchar(128)
1 , -- PasswordFormat - int
@SALT , -- PasswordSalt - nvarchar(128)
NULL , -- MobilePIN - nvarchar(16)
@Email , -- Email - nvarchar(256)
LOWER(@Email) , -- LoweredEmail - nvarchar(256)
'Pregunta' , -- PasswordQuestion - nvarchar(256)
@PASSWORDECRYPT , -- PasswordAnswer - nvarchar(128)
1 , -- IsApproved - bit
0 , -- IsLockedOut - bit
GETDATE() , -- CreateDate - datetime
GETDATE() , -- LastLoginDate - datetime
GETDATE() , -- LastPasswordChangedDate - datetime
'18990101' , -- LastLockoutDate - datetime
0 , -- FailedPasswordAttemptCount - int
'18990101' , -- FailedPasswordAttemptWindowStart - datetime
0 , -- FailedPasswordAnswerAttemptCount - int
'18990101', -- FailedPasswordAnswerAttemptWindowStart - datetime
@PASS -- Comment - ntext
FROM
dbo.[aspnet_Applications]
/*Rol Empresa*/
INSERT INTO dbo.aspnet_UsersInRoles
( UserId, RoleId )
SELECT @USERID, -- UserId - uniqueidentifier
RoleId -- RoleId - uniqueidentifier
FROM dbo.aspnet_Roles WHERE RoleName IN ('Empresas')
IF EXISTS (SELECT NULL FROM [dbo].[Empresa] WHERE [EMP_RFC] IN (SELECT [EmpresaUser_Empresa] FROM [dbo].[EmpresaUser] WHERE [EmpresaUser_Email] = @Email))
BEGIN
INSERT INTO dbo.aspnet_UsersInRoles
( UserId, RoleId )
SELECT @USERID, -- UserId - uniqueidentifier
RoleId -- RoleId - uniqueidentifier
FROM dbo.aspnet_Roles WHERE RoleName IN ('Empresas')
END
IF @CantidadContactosEmpresa = 1
BEGIN
INSERT INTO dbo.aspnet_UsersInRoles
( UserId, RoleId )
SELECT @USERID, -- UserId - uniqueidentifier
RoleId -- RoleId - uniqueidentifier
FROM dbo.aspnet_Roles WHERE RoleName IN ('Empresas')
END
SET @MensajeRegreso = 'Creo que funcionó ...'
END
ELSE
BEGIN
INSERT INTO dbo.aspnet_Users
( ApplicationId ,
UserId ,
UserName ,
LoweredUserName ,
MobileAlias ,
IsAnonymous ,
LastActivityDate
)
SELECT TOP 1 ApplicationId , -- ApplicationId - uniqueidentifier
NEWID() , -- UserId - uniqueidentifier
@Email , -- UserName - nvarchar(256)
LOWER(@Email) , -- LoweredUserName - nvarchar(256)
NULL , -- MobileAlias - nvarchar(16)
0 , -- IsAnonymous - bit
GETDATE() -- LastActivityDate - datetime
FROM dbo.aspnet_Applications
SET @USERID = (SELECT UserId FROM dbo.aspnet_Users WHERE UserName = @Email)
INSERT INTO dbo.aspnet_Membership
( ApplicationId ,
UserId ,
Password ,
PasswordFormat ,
PasswordSalt ,
MobilePIN ,
Email ,
LoweredEmail ,
PasswordQuestion ,
PasswordAnswer ,
IsApproved ,
IsLockedOut ,
CreateDate ,
LastLoginDate ,
LastPasswordChangedDate ,
LastLockoutDate ,
FailedPasswordAttemptCount ,
FailedPasswordAttemptWindowStart ,
FailedPasswordAnswerAttemptCount ,
FailedPasswordAnswerAttemptWindowStart ,
Comment
)
SELECT ApplicationId , -- ApplicationId - uniqueidentifier
@USERID , -- UserId - uniqueidentifier
@PASSWORDECRYPT , -- Password - nvarchar(128)
1 , -- PasswordFormat - int
@SALT , -- PasswordSalt - nvarchar(128)
NULL , -- MobilePIN - nvarchar(16)
@Email , -- Email - nvarchar(256)
LOWER(@Email) , -- LoweredEmail - nvarchar(256)
'Pregunta' , -- PasswordQuestion - nvarchar(256)
@PASSWORDECRYPT , -- PasswordAnswer - nvarchar(128)
1 , -- IsApproved - bit
0 , -- IsLockedOut - bit
GETDATE() , -- CreateDate - datetime
GETDATE() , -- LastLoginDate - datetime
GETDATE() , -- LastPasswordChangedDate - datetime
'18990101' , -- LastLockoutDate - datetime
0 , -- FailedPasswordAttemptCount - int
'18990101' , -- FailedPasswordAttemptWindowStart - datetime
0 , -- FailedPasswordAnswerAttemptCount - int
'18990101', -- FailedPasswordAnswerAttemptWindowStart - datetime
@PASS -- Comment - ntext
FROM dbo.[aspnet_Applications]
/*Rol Empresa*/
INSERT INTO dbo.aspnet_UsersInRoles
( UserId, RoleId )
SELECT @USERID, -- UserId - uniqueidentifier
RoleId -- RoleId - uniqueidentifier
FROM dbo.aspnet_Roles WHERE RoleName IN ('Empresas')
IF EXISTS (SELECT NULL FROM [dbo].[Empresa] WHERE [EMP_RFC] IN (SELECT [EmpresaUser_Empresa] FROM [dbo].[EmpresaUser] WHERE [EmpresaUser_Email] = @Email))
BEGIN
INSERT INTO dbo.aspnet_UsersInRoles
( UserId, RoleId )
SELECT @USERID, -- UserId - uniqueidentifier
RoleId -- RoleId - uniqueidentifier
FROM dbo.aspnet_Roles WHERE RoleName IN ('Empresas')
END
SET @PASS = (SELECT TOP 1 [EmpresaUser_Password] FROM [dbo].[EmpresaUser] WHERE [EmpresaUser_Email] = @Email ORDER BY [EmpresaUser_Email])
UPDATE [dbo].[EmpresaUser] SET [EmpresaUser_Password] = @PASS WHERE [EmpresaUser_Email] = @Email
SET @MensajeRegreso = 'No creo que funcione ...'
END
END
IF @Nuevo IN (0, 1)
BEGIN
SELECT @MensajeRegreso AS Mensaje
END
END
每次插入电子邮件和密码时都会出现此错误:
无法在具有唯一索引“aspnet\u Users\u index”的对象“dbo.aspnet\u Users”中插入重复的键行。重复的键值为(f12020b5-6b40-488a-bc55-2bb4708986b2,)。违反主键约束“PK__aspnet_M__1788CC4DA6E8A466”。无法在对象“dbo.aspnet_成员身份”中插入重复密钥。重复的键值为(556ba324-9720-4081-a4be-89fbb38902fc)。违反主键约束“PK__aspnet___AF2760AD5013D67A”。无法在对象“dbo.aspnet\u UsersInRoles”中插入重复键。重复的键值为(556ba324-9720-4081-a4be-89fbb38902fc、084b9f2d-08d4-4e74-911e-ac5ae50dfaf9)。声明已终止。声明已终止。声明已终止
将distinct添加到select语句
SELECT DISTINCT @USERID, -- UserId - uniqueidentifier
RoleId -- RoleId - uniqueidentifier
FROM dbo.aspnet_Roles WHERE RoleName IN ('Empresas')
您可以检查@USERID是否为NULL,这很好。但在
ELSE
(即@USERID不是null
)部分中,您尝试再次插入。这是您违反PK的行为。“无法插入重复密钥”似乎不言自明。您在理解哪一部分时遇到困难?问题是,该过程在没有将用户名和电子邮件添加到aspnet_成员表的情况下插入数据库