当前位置: 代码迷 >> Sql Server >> 存储过程带事宜,拼接id,返回值
  详细解决方案

存储过程带事宜,拼接id,返回值

热度:255   发布时间:2016-04-24 08:43:59.0
存储过程带事务,拼接id,返回值

出处: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
复制代码
  相关解决方案