zoukankan      html  css  js  c++  java
  • 存储过程带事务,拼接id,返回值

    以下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 TRANSACTION
    10             DELETE FROM tb_leavewordID WHERE leavewordID=@leavewordID
    11             DELETE FROM tb_reply WHERE leavewordID=@leavewordID
    12             SET @record=0 --成功
    13             COMMIT TRANSACTION
    14     END TRY
    15     BEGIN CATCH
    16         ROLLBACK TRANSACTION
    17         SET @record=-1 --失败
    18     END CATCH
    19     RETURN @record
    20 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,6
    10     SET @leavewordCount=(SELECT ISNULL(COUNT(1),0) FROM tb_leaveword WHERE newsID=@newsID)
    11     SET @delete_where=''
    12 
    13     IF(@leavewordCount=0) --此条新闻无留言时
    14         BEGIN TRY
    15             DELETE FROM tb_news WHERE newsID=@newsID
    16             SET @record=0 --成功
    17         END TRY
    18         BEGIN CATCH
    19             SET @record=-1 --失败
    20         END CATCH
    21 
    22     ELSE IF(@leavewordCount>0) --此条新闻有留言时
    23        ----获取删除条件(start)----
    24        DECLARE MY_CURSOR CURSOR
    25        FOR SELECT leavewordID FROM tb_news WHERE newsID=@newsID
    26        BEGIN
    27            DECLARE @leavewordID INT
    28            OPEN MY_CURSOR
    29            FETCH NEXT FROM MY_CURSOR INTO @leavewordID
    30            IF(@leavewordID IS NOT NULL)
    31                SET @delete_where=@delete_where+CAST(@leavewordID AS VARCHAR(10))+','
    32                WHILE(@@FETCH_STATUS<>-1)
    33                    BEGIN
    34                        SET @leavewordID=NULL
    35                        FETCH NEXT FROM MY_CURSOR INTO @leavewordID
    36                        IF(@leavewordID IS NOT NULL)
    37                            SET @delete_where=@delete_where+CAST(@leavewordID AS VARCHAR(10))+','
    38                    END
    39         END
    40         CLOSE MY_CURSOR
    41         DEALLOCATE MY_CURSOR
    42         SET @delete_where=SUBSTRING(@delete_where,1,LEN(@delete_where)-1)
    43         ----获取删除条件(end)----
    44         BEGIN
    45             BEGIN TRY
    46                 BEGIN TRANSACTION
    47                     DELETE FROM tb_news WHERE newsID=@newsID
    48                     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 TRANSACTION
    52             END TRY
    53             BEGIN CATCH
    54                 ROLLBACK TRANSACTION
    55                 SET @record=-1 --失败
    56             END CATCH
    57         END
    58      RETURN @record
    59 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 TRY
    12             DELETE FROM tb_news_type WHERE typeID=@typeID
    13             SET @record=0 --成功
    14         END TRY
    15         BEGIN CATCH
    16             SET @record=-1 --失败
    17         END CATCH
    18     
    19     ELSE IF(@newsCount>0) --此类型下有新闻
    20         BEGIN TRY
    21             BEGIN TRANSACTION
    22                 DECLARE MY_CURDOR CURSOR
    23                 FOR SELECT newsID FROM tb_news WHERE typeID=@typeID
    24                 BEGIN
    25                     DECLARE @newsID INT
    26                     OPEN MY_CURSOR
    27                     FETCH NEXT FROM MY_CURSOR INTO @newsID
    28                     IF(@newsID IS NOT NULL)
    29                         DELETE FROM tb_news_type WHERE typeID=@typeID
    30                         EXECUTE proc_tb_news_delete @newsID=@newsID --执行存储过程
    31                         WHILE(@@FETCH_STATUS<>-1)
    32                             BEGIN
    33                                 SET @newsID=NULL
    34                                 FETCH NEXT FROM MY_CURSOR INTO @newsID
    35                                 IF(@newsID IS NOT NULL)
    36                                     DELETE FROM tb_news_type WHERE typeID=@typeID
    37                                     EXECUTE proc_tb_news_delete @newsID=@newsID --执行存储过程
    38                             END
    39                 END
    40                 CLOSE MY_CURSOR
    41                 DEALLOCATE MY_CURSOR
    42                 COMMIT TRANSACTION
    43         END TRY
    44         BEGIN CATCH
    45             ROLLBACK TRANSACTION
    46             SET @record=-1 --失败
    47         END CATCH
    48      RETURN @record
    49 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 TRANSACTION
    10                 DECLARE @index INT
    11                 DECLARE @typeID INT
    12                 SET @typeID_list=RTRIM(LTRIM(@typeID_list))
    13                 SET @index=CHARINDEX(',',@typeID_list)
    14                 WHILE @index>=1
    15                     BEGIN
    16                         SET @typeID=CAST(LEFT(@typeID_list,@index-1) AS INT)
    17                         EXECUTE proc_tb_news_type_delete @typeID=@typeID
    18                         SET @typeID_list=SUBSTRING(@typeID_list,@index+1,LEN(@typeID_list)-1)
    19                         SET @index=CHARINDEX(',',@typeID_list)
    20                     END
    21             COMMIT TRANSACTION
    22             SET @record=0 --成功
    23     END TRY
    24     BEGIN CATCH
    25         ROLLBACK TRANSACTION
    26         SET @record=-1 --失败
    27     END CATCH
    28     RETURN @record
    29 END

    随机生成大写字母字符串

    大写字母65-90 小写字母97-122

    DECLARE @random INT
    DECLARE @i INT
    DECLARE @az VARCHAR(8)
    SET @i=1
    SET @az=CHAR(FLOOR(RAND()*26)+65)
    WHILE @i<8
        BEGIN
            SET @i=@i+1
            SET @az=@az+CHAR(FLOOR(RAND()*26)+65)
        END
    PRINT @az

    如需转载,请注明出处

  • 相关阅读:
    UVa-10317
    UVa-1595
    UVa-10391
    UVa-10763
    UVa-10935
    UVa-1594
    UVa-1593
    从CSDN搬过来了
    memset会显著增加时间和空间的消耗吗
    memset对数组的初始化
  • 原文地址:https://www.cnblogs.com/cmsdn/p/2469568.html
Copyright © 2011-2022 走看看