关于存储过程的一点疑问

allen0118 2012-08-09 08:53:39


这个存储过程是将用户传入进来的字符串分开插入到数据库里面,
语句如下:usp_Insert '0129100001,0129100002,0129100003,0129100004,0129100005,','C00001','LINE3','admin'
目地是将0129100001,0129100002,0129100003,0129100004,0129100005分开插入到表里面,第一次插入的时候没有问题,
但是如果数据库里面有重复的记录的话这个存储过程就变成死循环了,不知道是不是跟那个循环变量赋值的时候有问题呢?

IF EXISTS(SELECT * FROM SYSOBJECTS WHERE name='usp_Insert')
DROP PROC usp_Insert
GO
CREATE PROCEDURE usp_Insert
@SN VARCHAR(1024)=' ',
@CartonSN VARCHAR(20)=' ',
@LineName VARCHAR(5)=' ',
@UserID VARCHAR(10)=' '
AS


--usp_Insert '0129100001,0129100002,0129100003,0129100004,0129100005,','C00001','LINE3','admin'

/*这一部分就是处理之后的SQL语句,
INSERT INTO TestTB(SN,CartonSN,LineName,UserID,CreateDate) VALUES('0129100001','C00001','LINE3','admin',GETDATE())

INSERT INTO TestTB(SN,CartonSN,LineName,UserID,CreateDate) VALUES('0129100002','C00001','LINE3','admin',GETDATE())

INSERT INTO TestTB(SN,CartonSN,LineName,UserID,CreateDate) VALUES('0129100003','C00001','LINE3','admin',GETDATE())

INSERT INTO TestTB(SN,CartonSN,LineName,UserID,CreateDate) VALUES('0129100004','C00001','LINE3','admin',GETDATE())

INSERT INTO TestTB(SN,CartonSN,LineName,UserID,CreateDate) VALUES('0129100005','C00001','LINE3','admin',GETDATE())
*/


BEGIN TRAN
DECLARE @SN_N VARCHAR(1024),@ERRDESC VARCHAR(100)
SELECT @SN_N =@SN

WHILE CHARINDEX(',',@SN_N)>0
BEGIN

IF NOT EXISTS(SELECT * FROM PK2 WHERE SN=LEFT(@SN_N,CHARINDEX(',',@SN_N)-1))
BEGIN

INSERT INTO TestTB(SN,CartonSN,LineName,UserID,CreateDate)
VALUES(LEFT(@SN_N,CHARINDEX(',',@SN_N)-1),@CartonSN, @LineName,@UserID,GETDATE())
SET @SN_N=REPLACE(@SN_N,LEFT(@SN_N,CHARINDEX(',',@SN_N)),'')
IF @@ERROR<>0
BEGIN
SELECT FERRDESC='数据保存失败'
RAISERROR(@ERRDESC,16,1)
ROLLBACK TRAN
RETURN
END
END
END

COMMIT TRAN
...全文
99 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
koumingjie 2012-08-09
  • 打赏
  • 举报
回复

WHILE CHARINDEX(',',@SN_N)>0
BEGIN

IF NOT EXISTS(SELECT * FROM TestTB WHERE SN=LEFT(@SN_N,CHARINDEX(',',@SN_N)-1))
BEGIN

INSERT INTO TestTB(SN,CartonSN,LineName,UserID,CreateDate)
VALUES(LEFT(@SN_N,CHARINDEX(',',@SN_N)-1),@CartonSN, @LineName,@UserID,GETDATE())

IF @@ERROR<>0
BEGIN
SELECT FERRDESC='数据保存失败'
RAISERROR(@ERRDESC,16,1)
ROLLBACK TRAN
RETURN
END
END

SET @SN_N=REPLACE(@SN_N,LEFT(@SN_N,CHARINDEX(',',@SN_N)),'') -----放到这里

END

COMMIT TRAN
以学习为目的 2012-08-09
  • 打赏
  • 举报
回复
好邪恶的404,你懂得


你的最外层BEGIN...END程序块,当有记录时,满足CHARINDEX(',',@SN_N)>0
allen0118 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
SQL code

IF NOT EXISTS(SELECT * FROM PK2 WHERE SN=LEFT(@SN_N,CHARINDEX(',',@SN_N)-1))
BEGIN

INSERT INTO TestTB(SN,CartonSN,LineName,UserID,CreateDate)
VAL……
[/Quote]

感谢,确实是这个问题!
以学习为目的 2012-08-09
  • 打赏
  • 举报
回复

WHILE CHARINDEX(',',@SN_N)>0
BEGIN

IF NOT EXISTS(SELECT * FROM PK2 WHERE SN=LEFT(@SN_N,CHARINDEX(',',@SN_N)-1))
BEGIN

INSERT INTO TestTB(SN,CartonSN,LineName,UserID,CreateDate)
VALUES(LEFT(@SN_N,CHARINDEX(',',@SN_N)-1),@CartonSN, @LineName,@UserID,GETDATE())
SET @SN_N=REPLACE(@SN_N,LEFT(@SN_N,CHARINDEX(',',@SN_N)),'')
IF @@ERROR<>0
BEGIN
SELECT FERRDESC='数据保存失败'
RAISERROR(@ERRDESC,16,1)
ROLLBACK TRAN
RETURN
END
END
else SELECT @SN_N=REPLACE(@SN_N,LEFT(@SN_N,CHARINDEX(',',@SN_N)),'') --加这句试试


END


人生无悔 2012-08-09
  • 打赏
  • 举报
回复
因你新增一条后,另一条重复的已不符合条件了,所以都会不处理,不死循环才怪
人生无悔 2012-08-09
  • 打赏
  • 举报
回复

IF NOT EXISTS(SELECT * FROM PK2 WHERE SN=LEFT(@SN_N,CHARINDEX(',',@SN_N)-1))
BEGIN

INSERT INTO TestTB(SN,CartonSN,LineName,UserID,CreateDate)
VALUES(LEFT(@SN_N,CHARINDEX(',',@SN_N)-1),@CartonSN, @LineName,@UserID,GETDATE())
SET @SN_N=REPLACE(@SN_N,LEFT(@SN_N,CHARINDEX(',',@SN_N)),'')
IF @@ERROR<>0
BEGIN
SELECT FERRDESC='数据保存失败'
RAISERROR(@ERRDESC,16,1)
ROLLBACK TRAN
RETURN
END
END
else SET @SN_N=REPLACE(@SN_N,LEFT(@SN_N,CHARINDEX(',',@SN_N)),'') --加这句就可以了
以学习为目的 2012-08-09
  • 打赏
  • 举报
回复
先SF,慢慢看
以学习为目的 2012-08-09
  • 打赏
  • 举报
回复
先SF,慢慢看

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧