一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - sqlserver 存儲過程帶事務 拼接id 返回值

sqlserver 存儲過程帶事務 拼接id 返回值

2019-12-24 14:26cnblogsxu_happy_you Sql Server

存儲過程帶事務,拼接id,返回值 以下SQL以防以后還需用到,特此備份

刪除一條留言信息會級聯刪除回復信息,這時我們需要用到事務,如下SQL

復制代碼代碼如下:


ALTER PROCEDURE [dbo].[proc_tb_leaveword_delete]
 ( 
     @leavewordID INT,
     @record TINYINT OUTPUT
 )    
 AS
 BEGIN
     BEGIN TRY
         BEGIN TRANSACTION
             DELETE FROM tb_leavewordID WHERE leavewordID=@leavewordID
             DELETE FROM tb_reply WHERE leavewordID=@leavewordID
             SET @record=0 --成功
             COMMIT TRANSACTION
     END TRY
     BEGIN CATCH
         ROLLBACK TRANSACTION
         SET @record=-1 --失敗
     END CATCH
     RETURN @record
 END


刪除一條新聞,一條新聞可能有多條留言,每條留言可能有回復信息,這時我們刪除一條新聞的SQL如下

復制代碼代碼如下:


ALTER PROCEDURE [dbo].[proc_tb_news_delete]
 ( 
     @newsID INT,
     @record TINYINT OUTPUT
 )    
 AS
 BEGIN
     DECLARE @leavewordCount INT --留言個數
     DECLARE @delete_where VARCHAR(4000) --留言id字符,類似1,2,4,5,6
     SET @leavewordCount=(SELECT ISNULL(COUNT(1),0) FROM tb_leaveword WHERE newsID=@newsID)
     SET @delete_where=''
     IF(@leavewordCount=0) --此條新聞無留言時
         BEGIN TRY
             DELETE FROM tb_news WHERE newsID=@newsID
             SET @record=0 --成功
         END TRY
         BEGIN CATCH
             SET @record=-1 --失敗
         END CATCH
     ELSE IF(@leavewordCount>0) --此條新聞有留言時
        ----獲取刪除條件(start)----
        DECLARE MY_CURSOR CURSOR
        FOR SELECT leavewordID FROM tb_news WHERE newsID=@newsID
        BEGIN
            DECLARE @leavewordID INT
            OPEN MY_CURSOR
            FETCH NEXT FROM MY_CURSOR INTO @leavewordID
            IF(@leavewordID IS NOT NULL)
                SET @delete_where=@delete_where+CAST(@leavewordID AS VARCHAR(10))+','
                WHILE(@@FETCH_STATUS<>-1)
                    BEGIN
                        SET @leavewordID=NULL
                        FETCH NEXT FROM MY_CURSOR INTO @leavewordID
                        IF(@leavewordID IS NOT NULL)
                            SET @delete_where=@delete_where+CAST(@leavewordID AS VARCHAR(10))+','
                    END
         END
         CLOSE MY_CURSOR
         DEALLOCATE MY_CURSOR
         SET @delete_where=SUBSTRING(@delete_where,1,LEN(@delete_where)-1)
         ----獲取刪除條件(end)----
         BEGIN
             BEGIN TRY
                 BEGIN TRANSACTION
                     DELETE FROM tb_news WHERE newsID=@newsID
                     EXECUTE('DELETE FROM tb_leaveword WHERE leavewordID IN('+@delete_where+')')
                     EXECUTE('DELETE FROM tb_reply WHERE leavewordID IN('+@delete_where+')')
                     SET @record=0 --成功
                     COMMIT TRANSACTION
             END TRY
             BEGIN CATCH
                 ROLLBACK TRANSACTION
                 SET @record=-1 --失敗
             END CATCH
         END
      RETURN @record
 END


刪除一新聞類型時,可能此類型下有多條新聞,此條新聞下又有多條留言,留言下又有多條回復,依次級聯刪除,如下存儲過程

復制代碼代碼如下:


ALTER PROCEDURE [dbo].[proc_tb_news_type_delete]
 ( 
     @typeID INT,
     @record TINYINT OUTPUT
 )
 AS
 BEGIN
     DECLARE @newsCount INT --此類新聞下的新聞個數
     SET @newsCount=(SELECT ISNULL(COUNT(1),0) FROM tb_news WHERE typeID=@typeID)
     IF(@newsCount=0) --此類型下無新聞
         BEGIN TRY
             DELETE FROM tb_news_type WHERE typeID=@typeID
             SET @record=0 --成功
         END TRY
         BEGIN CATCH
             SET @record=-1 --失敗
         END CATCH
     ELSE IF(@newsCount>0) --此類型下有新聞
         BEGIN TRY
             BEGIN TRANSACTION
                 DECLARE MY_CURDOR CURSOR
                 FOR SELECT newsID FROM tb_news WHERE typeID=@typeID
                 BEGIN
                     DECLARE @newsID INT
                     OPEN MY_CURSOR
                     FETCH NEXT FROM MY_CURSOR INTO @newsID
                     IF(@newsID IS NOT NULL)
                         DELETE FROM tb_news_type WHERE typeID=@typeID
                         EXECUTE proc_tb_news_delete @newsID=@newsID --執行存儲過程
                         WHILE(@@FETCH_STATUS<>-1)
                             BEGIN
                                 SET @newsID=NULL
                                 FETCH NEXT FROM MY_CURSOR INTO @newsID
                                 IF(@newsID IS NOT NULL)
                                     DELETE FROM tb_news_type WHERE typeID=@typeID
                                     EXECUTE proc_tb_news_delete @newsID=@newsID --執行存儲過程
                             END
                 END
                 CLOSE MY_CURSOR
                 DEALLOCATE MY_CURSOR
                 COMMIT TRANSACTION
         END TRY
         BEGIN CATCH
             ROLLBACK TRANSACTION
             SET @record=-1 --失敗
         END CATCH
      RETURN @record
 END


當刪除多條新聞類型時,我們需要把拼接好的類型id,例如:1,2,4,5,12,34,穿入存儲過程,分割字符的SQL語句如下所示:

復制代碼代碼如下:


DECLARE @A VARCHAR(5000)
 DECLARE @i INT
 SET @A='A,B,C,D,D,S,X,C,C,C,D,AAAA,DDDDDD,DEF,ERT,'
 SET @i=CHARINDEX(',',@A)
 WHILE @i>=1
 BEGIN
     PRINT LEFT(@A,@i-1)
     SET @A=SUBSTRING(@A,@i+1,LEN(@A)-1)
     SET @i=CHARINDEX(',',@A)
 END


刪除多條新聞類型SQL如下:

復制代碼代碼如下:


ALTER PROCEDURE [dbo].[proc_tb_news_type_selects_delete]
 ( 
     @typeID_list VARCHAR(500),
     @record TINYINT OUTPUT
 )
 AS
 BEGIN
     BEGIN TRY
             BEGIN TRANSACTION
                 DECLARE @index INT
                 DECLARE @typeID INT
                 SET @typeID_list=RTRIM(LTRIM(@typeID_list))
                 SET @index=CHARINDEX(',',@typeID_list)
                 WHILE @index>=1
                     BEGIN
                         SET @typeID=CAST(LEFT(@typeID_list,@index-1) AS INT)
                         EXECUTE proc_tb_news_type_delete @typeID=@typeID
                         SET @typeID_list=SUBSTRING(@typeID_list,@index+1,LEN(@typeID_list)-1)
                         SET @index=CHARINDEX(',',@typeID_list)
                     END
             COMMIT TRANSACTION
             SET @record=0 --成功
     END TRY
     BEGIN CATCH
         ROLLBACK TRANSACTION
         SET @record=-1 --失敗
     END CATCH
     RETURN @record
 END


作者:cnblogs xu_happy_you

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品久久久久久久久久久搜索 | 黑人巨大精品战中国美女 | 青草国内精品视频在线观看 | 精品欧美一区二区精品久久 | 天海翼黄色三级 | 久久草福利自拍视频在线观看 | 91尤物在线视频 | 肥胖女人一级毛片 | 亚洲天堂视频在线播放 | 国产精品日韩在线观看 | 逼逼爱 | 九九热视频免费 | 免费国产成人高清视频网站 | 国产午夜一区二区在线观看 | 视频大全在线观看免费 | 亚洲男人天堂网站 | 我与肥熟老妇的性事 | 女同变态 中文字幕 | 人人爽人人香蕉 | 青青草色 | 精品视频免费在线 | 日本漫画工囗全彩番在线 | 亚洲a视频在线观看 | 边摸边操 | 9热在线精品视频观看 | 女八把屁股扒开让男生添 | 精品日韩欧美一区二区三区 | 国产精品久久一区 | 波多野结衣女老师 | 男人午夜免费视频 | 麻豆视频免费在线观看 | 人人澡人 | 全彩成人18h漫画 | 日本一道一区二区免费看 | 调教扩张宫颈女人惨叫 | 91在线精品国产丝袜超清 | 男人j放进女人的p视频免费 | 久久久久国产一级毛片高清片 | 国产午夜亚洲精品理论片不卡 | 视频在线观看国产 | 国产99久久精品一区二区 |