【发布时间】:2016-12-06 03:39:09
【问题描述】:
我已经编写了一个用于插入姓名和电子邮件地址的存储过程:
CREATE PROCEDURE [dbo].[usp_Referral_Email]
@user_key varchar(36),
@name nvarchar(100),
@email nvarchar(500),
@result int output
AS
BEGIN
DECLARE @username Nvarchar(500)
DECLARE @useremail Nvarchar(500)
DECLARE @CusrsorID CURSOR
SET @CusrsorID = CURSOR FOR
SELECT Value,Value1
FROM ufn_split_string(@name,@email)
OPEN @CusrsorID
FETCH NEXT FROM @CusrsorID INTO @username, @useremail
WHILE @@FETCH_STATUS = 0
BEGIN
declare @user nvarchar(36)
begin try
begin transaction trans_Referral_Email
IF NOT EXISTS (SELECT 1 FROM dbo.C_User_Credentials
WHERE email = @useremail)
BEGIN
IF NOT EXISTS (SELECT 1 FROM dbo.Referral_Email
WHERE R_Email = @useremail)
BEGIN
INSERT INTO dbo.Referral_Email (CFK_C_UP_key, R_Name, R_Email)
VALUES (@user_key, @username, @useremail)
SET @result = 1
END
ELSE
BEGIN
SET @result = 0
END
END
ELSE
BEGIN
SET @result = 0
END
COMMIT transaction trans_Referral_Email
end try
begin catch
rollback transaction trans_Referral_Email
set @result=ERROR_MESSAGE()
end catch
FETCH NEXT FROM @CusrsorID INTO @username, @useremail
END
CLOSE @CusrsorID
DEALLOCATE @CusrsorID
END
作为一个例子,我将传递值
-
@name=ramesh,suresh,rahul -
@email=ramesh@gmail.com,suresh@gmail.com,rahul@gmail.com
在插入之前我们检查条件电子邮件地址是否存在,假设电子邮件地址存在它不会插入到表中。 现在我的问题是我将通过示例进行解释。 ramesh@gmail.com 和 suresh@gmail.com 是新的电子邮件地址,这两个电子邮件地址都将插入表中,因此返回值为 1 rahul@gmail.com 已经存在于表中,因此它将插入到表中,因此返回值将是 0 并且输出 @return 值将是 0 但我们插入了 2 封电子邮件地址所以我需要 @return 值应该是 1 作为输出。
所以我的问题是,如果一个电子邮件地址也插入输出应该是 @return=1
【问题讨论】:
-
你看过 MERGE() 吗?它似乎非常适合此类问题。与@@ROWCOUNT 配对
-
你到底为什么要使用这样的循环来插入数据?这应该是基于集合的方法。这让我想知道您的分离器是否也是基于循环的解决方案。以下是循环分离器的一些更好的替代方案。 sqlperformance.com/2012/07/t-sql-queries/split-strings
标签: sql-server stored-procedures