出处:http://www.cnblogs.com/cmsdn/archive/2012/04/25/2469568.html
以下SQL以防以后还需用到,特此备份
删除一条留言信息会级联删除回复信息,这时我们需要用到事务,如下SQL
1 ALTER PROCEDURE [dbo].[proc_tb_leaveword_delete] 2 ( 3 @leavewordID INT, 4 @record TINYINT OUTPUT 5 ) 6 AS 7 BEGIN 8 BEGIN TRY 9 BEGIN TRANSACTION10 DELETE FROM tb_leavewordID WHERE leavewordID=@leavewordID11 DELETE FROM tb_reply WHERE leavewordID=@leavewordID12 SET @record=0 --成功13 COMMIT TRANSACTION14 END TRY15 BEGIN CATCH16 ROLLBACK TRANSACTION17 SET @record=-1 --失败18 END CATCH19 RETURN @record20 END
删除一条新闻,一条新闻可能有多条留言,每条留言可能有回复信息,这时我们删除一条新闻的SQL如下
1 ALTER PROCEDURE [dbo].[proc_tb_news_delete] 2 ( 3 @newsID INT, 4 @record TINYINT OUTPUT 5 ) 6 AS 7 BEGIN 8 DECLARE @leavewordCount INT --留言个数 9 DECLARE @delete_where VARCHAR(4000) --留言id字符,类似1,2,4,5,610 SET @leavewordCount=(SELECT ISNULL(COUNT(1),0) FROM tb_leaveword WHERE newsID=@newsID)11 SET @delete_where=''12 13 IF(@leavewordCount=0) --此条新闻无留言时14 BEGIN TRY15 DELETE FROM tb_news WHERE newsID=@newsID16 SET @record=0 --成功17 END TRY18 BEGIN CATCH19 SET @record=-1 --失败20 END CATCH21 22 ELSE IF(@leavewordCount>0) --此条新闻有留言时23 ----获取删除条件(start)----24 DECLARE MY_CURSOR CURSOR25 FOR SELECT leavewordID FROM tb_news WHERE newsID=@newsID26 BEGIN27 DECLARE @leavewordID INT28 OPEN MY_CURSOR29 FETCH NEXT FROM MY_CURSOR INTO @leavewordID30 IF(@leavewordID IS NOT NULL)31 SET @delete_where=@delete_where+CAST(@leavewordID AS VARCHAR(10))+','32 WHILE(@@FETCH_STATUS<>-1)33 BEGIN34 SET @leavewordID=NULL35 FETCH NEXT FROM MY_CURSOR INTO @leavewordID36 IF(@leavewordID IS NOT NULL)37 SET @delete_where=@delete_where+CAST(@leavewordID AS VARCHAR(10))+','38 END39 END40 CLOSE MY_CURSOR41 DEALLOCATE MY_CURSOR42 SET @delete_where=SUBSTRING(@delete_where,1,LEN(@delete_where)-1)43 ----获取删除条件(end)----44 BEGIN45 BEGIN TRY46 BEGIN TRANSACTION47 DELETE FROM tb_news WHERE newsID=@newsID48 EXECUTE('DELETE FROM tb_leaveword WHERE leavewordID IN('+@delete_where+')')49 EXECUTE('DELETE FROM tb_reply WHERE leavewordID IN('+@delete_where+')')50 SET @record=0 --成功51 COMMIT TRANSACTION52 END TRY53 BEGIN CATCH54 ROLLBACK TRANSACTION55 SET @record=-1 --失败56 END CATCH57 END58 RETURN @record59 END
删除一新闻类型时,可能此类型下有多条新闻,此条新闻下又有多条留言,留言下又有多条回复,依次级联删除,如下存储过程
1 ALTER PROCEDURE [dbo].[proc_tb_news_type_delete] 2 ( 3 @typeID INT, 4 @record TINYINT OUTPUT 5 ) 6 AS 7 BEGIN 8 DECLARE @newsCount INT --此类新闻下的新闻个数 9 SET @newsCount=(SELECT ISNULL(COUNT(1),0) FROM tb_news WHERE typeID=@typeID)10 IF(@newsCount=0) --此类型下无新闻11 BEGIN TRY12 DELETE FROM tb_news_type WHERE typeID=@typeID13 SET @record=0 --成功14 END TRY15 BEGIN CATCH16 SET @record=-1 --失败17 END CATCH18 19 ELSE IF(@newsCount>0) --此类型下有新闻20 BEGIN TRY21 BEGIN TRANSACTION22 DECLARE MY_CURDOR CURSOR23 FOR SELECT newsID FROM tb_news WHERE typeID=@typeID24 BEGIN25 DECLARE @newsID INT26 OPEN MY_CURSOR27 FETCH NEXT FROM MY_CURSOR INTO @newsID28 IF(@newsID IS NOT NULL)29 DELETE FROM tb_news_type WHERE typeID=@typeID30 EXECUTE proc_tb_news_delete @newsID=@newsID --执行存储过程31 WHILE(@@FETCH_STATUS<>-1)32 BEGIN33 SET @newsID=NULL34 FETCH NEXT FROM MY_CURSOR INTO @newsID35 IF(@newsID IS NOT NULL)36 DELETE FROM tb_news_type WHERE typeID=@typeID37 EXECUTE proc_tb_news_delete @newsID=@newsID --执行存储过程38 END39 END40 CLOSE MY_CURSOR41 DEALLOCATE MY_CURSOR42 COMMIT TRANSACTION43 END TRY44 BEGIN CATCH45 ROLLBACK TRANSACTION46 SET @record=-1 --失败47 END CATCH48 RETURN @record49 END
当删除多条新闻类型时,我们需要把拼接好的类型id,例如:1,2,4,5,12,34,穿入存储过程,分割字符的SQL语句如下所示:
1 DECLARE @A VARCHAR(5000) 2 DECLARE @i INT 3 SET @A='A,B,C,D,D,S,X,C,C,C,D,AAAA,DDDDDD,DEF,ERT,' 4 SET @i=CHARINDEX(',',@A) 5 6 WHILE @i>=1 7 BEGIN 8 PRINT LEFT(@A,@i-1) 9 SET @A=SUBSTRING(@A,@i+1,LEN(@A)-1)10 SET @i=CHARINDEX(',',@A)11 END
删除多条新闻类型SQL如下:
1 ALTER PROCEDURE [dbo].[proc_tb_news_type_selects_delete] 2 ( 3 @typeID_list VARCHAR(500), 4 @record TINYINT OUTPUT 5 ) 6 AS 7 BEGIN 8 BEGIN TRY 9 BEGIN TRANSACTION10 DECLARE @index INT11 DECLARE @typeID INT12 SET @typeID_list=RTRIM(LTRIM(@typeID_list))13 SET @index=CHARINDEX(',',@typeID_list)14 WHILE @index>=115 BEGIN16 SET @typeID=CAST(LEFT(@typeID_list,@index-1) AS INT)17 EXECUTE proc_tb_news_type_delete @typeID=@typeID18 SET @typeID_list=SUBSTRING(@typeID_list,@index+1,LEN(@typeID_list)-1)19 SET @index=CHARINDEX(',',@typeID_list)20 END21 COMMIT TRANSACTION22 SET @record=0 --成功23 END TRY24 BEGIN CATCH25 ROLLBACK TRANSACTION26 SET @record=-1 --失败27 END CATCH28 RETURN @record29 END
随机生成大写字母字符串
大写字母65-90 小写字母97-122
DECLARE @random INTDECLARE @i INTDECLARE @az VARCHAR(8)SET @i=1SET @az=CHAR(FLOOR(RAND()*26)+65)WHILE @i<8 BEGIN SET @i=@i+1 SET @az=@az+CHAR(FLOOR(RAND()*26)+65) ENDPRINT @az