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

来源:http://www.cnblogs.com/shouce/archive/2016/02/24/5211750.html
-Advertisement-
Play Games

出處:http://www.cnblogs.com/cmsdn/archive/2012/04/25/2469568.html 以下SQL以防以後還需用到,特此備份 刪除一條留言信息會級聯刪除回覆信息,這時我們需要用到事務,如下SQL 1 ALTER PROCEDURE [dbo].[proc_tb


出處: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 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
複製代碼
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android
  • 闡述動畫繪製線條顏色漸變的折線圖的實現方案,並封裝成UIView子類!
  • NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(someAction) userInfo:nil repeats:YES]; [[NSRunLoop mainRunLoop] addTi
  • 最近一直都在搞新員工的培訓材料,MySQL的培訓PPT我居然寫了100多頁,我都佩服我自己的毅力了。不如現在把這些總結一下,慢慢寫到博客里,供入門者參考。 一 關係型資料庫 關係型資料庫的理論提出於上世紀七十年代,由IBM的研究員E.F.Codd的論文提出。 關係型資料庫的理論基礎可以參考王珊和薩師
  • 回到目錄 一些概念 分區表在oracle和sqlserver中都上存在的,當數據表的數據量過大時,上千萬,上億的數據,在進行數據查詢時需要顯得比較慢,性能很差,這時是時候引入分區表了,分區表顧名思義,就是把物理表用一些文件NDF進行分塊存儲,以緩減IO的壓力,因為當你的SQL文件過大的,這其實對系統
  • 一個小時內學習SQLite資料庫 2012-05-11 10:24 紅薯 OSCHINA 字型大小:T | T SQLite 是一個開源的嵌入式關係資料庫,實現自包容、零配置、支持事務的SQL資料庫引擎。 其特點是高度便攜、使用方便、結構緊湊、高效、可靠。 與其他資料庫管理系統不同,SQLite 的安裝
  • 這裡僅僅用到了一種方式而已,把資料庫文件備份到磁碟然後在恢復. /* 2: 通過SQL 語句備份資料庫 3: */ 4: BACKUP DATABASE mydb 5: TO DISK ='C:\DBBACK\mydb.BAK' 6: --這裡指定需要備份資料庫的路徑和文件名,註意:路徑的文件夾是必
  • Oracle 中對中文欄位進行排序通常有三種方式 1)按筆畫排序 select * from Table order by nlssort(columnName,'NLS_SORT=SCHINESE_STROKE_M') 2)按部首排序 select * from Table order by nl
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...