最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SqlServer 2022通過(guò)臨時(shí)表和游標(biāo)遍歷方式邏輯處理獲取目標(biāo)數(shù)據(jù)

 更新時(shí)間:2024年04月22日 09:45:09   作者:全棧小5  
在SQL的存儲(chǔ)過(guò)程,函數(shù)中,經(jīng)常需要使用遍歷(遍歷table),其中游標(biāo)、臨時(shí)表等遍歷方法很常用,本文就來(lái)介紹一下SqlServer 2022通過(guò)臨時(shí)表和游標(biāo)遍歷方式邏輯處理獲取目標(biāo)數(shù)據(jù),感興趣的可以了解一下

在這里插入圖片描述

一、需求點(diǎn)描述

有如下數(shù)據(jù)集,有9條記錄,如果001前后一條記錄都不是001,那么就取001前面一條記錄以及本身001這條記錄、
如果001下一條記錄還是001,則取001最后一條記錄以及001剛開(kāi)始的前一條記錄

工作中心序號(hào)備注
10011
10022取這條記錄
0013取這條記錄
10044
10085取這條記錄
0016連續(xù)出現(xiàn)的首條前一條記錄
0017
0018取這條記錄
10099

1)查詢(xún)數(shù)據(jù)集

在這里插入圖片描述

2)目標(biāo)數(shù)據(jù)集

在這里插入圖片描述

二、臨時(shí)表

在 SQL Server 中,臨時(shí)表是一種用于存儲(chǔ)臨時(shí)數(shù)據(jù)的特殊表。
臨時(shí)表可以在查詢(xún)執(zhí)行期間被創(chuàng)建,并且只在當(dāng)前會(huì)話或連接有效。
它們對(duì)于需要存儲(chǔ)臨時(shí)數(shù)據(jù)的計(jì)算和操作非常有用。

SQL Server 提供了兩種類(lèi)型的臨時(shí)表:局部臨時(shí)表(Local Temporary Table)和全局臨時(shí)表(Global Temporary Table)。

2.1、局部臨時(shí)表(Local Temporary Table)

局部臨時(shí)表是以 # 開(kāi)頭的表名,只在創(chuàng)建它的會(huì)話中可見(jiàn)。
當(dāng)創(chuàng)建它的會(huì)話結(jié)束時(shí),該表會(huì)自動(dòng)刪除。其他會(huì)話無(wú)法訪問(wèn)這個(gè)表。

  • 示例創(chuàng)建局部臨時(shí)表:
CREATE TABLE #TempTable (
    ID INT,
    Name VARCHAR(50)
);

2.2、全局臨時(shí)表(Global Temporary Table)

全局臨時(shí)表是以 ## 開(kāi)頭的表名,可以在創(chuàng)建它的服務(wù)器實(shí)例上的任何會(huì)話中可見(jiàn)。
當(dāng)所有引用該表的會(huì)話結(jié)束時(shí),該表會(huì)自動(dòng)刪除。

  • 示例創(chuàng)建全局臨時(shí)表:
CREATE TABLE ##TempTable (
    ID INT,
    Name VARCHAR(50)
);

使用臨時(shí)表時(shí),可以像操作任何其他表一樣進(jìn)行數(shù)據(jù)插入、更新、刪除和查詢(xún)。

值得注意的是,臨時(shí)表的結(jié)構(gòu)(包括列定義和約束)與永久表類(lèi)似,可以創(chuàng)建索引、觸發(fā)器等對(duì)象。
然而,當(dāng)會(huì)話結(jié)束后,臨時(shí)表和與之相關(guān)的對(duì)象都會(huì)被自動(dòng)清理和刪除。

臨時(shí)表對(duì)于臨時(shí)性數(shù)據(jù)存儲(chǔ)和處理非常有用,例如在復(fù)雜的查詢(xún)和存儲(chǔ)過(guò)程中暫存中間結(jié)果或存儲(chǔ)需要跨多個(gè)查詢(xún)或操作之間共享的臨時(shí)數(shù)據(jù)。

三、游標(biāo)

在 SQL Server 中,游標(biāo)(Cursor)是一種用于遍歷結(jié)果集的數(shù)據(jù)庫(kù)對(duì)象。
它提供了一種逐行處理查詢(xún)結(jié)果的機(jī)制,可以在需要逐行操作數(shù)據(jù)的情況下使用。

以下是使用游標(biāo)的一般步驟:

3.1、聲明游標(biāo)

使用 DECLARE CURSOR 語(yǔ)句聲明游標(biāo),并指定游標(biāo)的名稱(chēng)和要遍歷的查詢(xún)。

DECLARE CursorName CURSOR FOR
    SELECT Column1, Column2
    FROM TableName;

3.2、打開(kāi)游標(biāo)

使用 OPEN 語(yǔ)句打開(kāi)游標(biāo),準(zhǔn)備開(kāi)始遍歷結(jié)果集。

OPEN CursorName;

3.3、獲取數(shù)據(jù)

使用 FETCH NEXT 語(yǔ)句獲取當(dāng)前游標(biāo)位置的一行數(shù)據(jù),并將其存儲(chǔ)到變量中??梢允褂?nbsp;INTO 子句將數(shù)據(jù)存儲(chǔ)到多個(gè)變量中。

FETCH NEXT FROM CursorName INTO @Variable1, @Variable2;

3.4、處理數(shù)據(jù)

在循環(huán)中對(duì)獲取的行數(shù)據(jù)進(jìn)行處理。這可以是對(duì)數(shù)據(jù)進(jìn)行計(jì)算、更新、刪除等操作,或者僅僅是輸出數(shù)據(jù)。

WHILE @@FETCH_STATUS = 0
BEGIN
    -- 處理數(shù)據(jù)
    -- 例如執(zhí)行一些操作或輸出數(shù)據(jù)
    
    FETCH NEXT FROM CursorName INTO @Variable1, @Variable2;
END;

3.5、關(guān)閉和釋放游標(biāo)

使用 CLOSE 關(guān)閉游標(biāo),將游標(biāo)的狀態(tài)置為不可使用,但不刪除游標(biāo)。最后使用 DEALLOCATE 釋放游標(biāo),并從內(nèi)存中刪除。

CLOSE CursorName;
DEALLOCATE CursorName;

注意事項(xiàng):

  • 使用游標(biāo)時(shí)要考慮性能和資源占用,因?yàn)橛螛?biāo)可能導(dǎo)致性能下降,并占用大量?jī)?nèi)存。
  • 在處理完成后,務(wù)必關(guān)閉和釋放游標(biāo),以釋放資源。
  • 可以使用 @@FETCH_STATUS 系統(tǒng)變量來(lái)判斷是否還有更多行可供遍歷。

游標(biāo)的使用需要謹(jǐn)慎考慮,只在必要的情況下使用,盡量使用集合操作來(lái)替代游標(biāo),以提高性能。

四、解決方案

根據(jù)上面了解到的臨時(shí)表和游標(biāo),結(jié)合需求,可以做如下邏輯操作,得到目標(biāo)查詢(xún)結(jié)果

代碼如下

-- 創(chuàng)建局部臨時(shí)表
if object_id('tempdb..#myTempTable') is not null begin
    drop table #myTempTable
end
/*else begin
    create table #myTempTable(
        工作中心 varchar(50),
        序號(hào) int
    )
end*/

-- 臨時(shí)表不存在情況下
select * into #myTempTable from(
    select '1001' 工作中心,1 序號(hào) union all
    select '1002' 工作中心,2 序號(hào) union all
    select '001' 工作中心,3 序號(hào) union all
    select '1004' 工作中心,4 序號(hào) union all
    select '1008' 工作中心,5 序號(hào) union all
    select '001' 工作中心,6 序號(hào) union all
    select '001' 工作中心,7 序號(hào) union all
    select '001' 工作中心,8 序號(hào) union all
    select '1009' 工作中心,9 序號(hào)
) a

-- select * from #myTempTable

-- 定義變狼
declare @工作中心 varchar(50)
declare @序號(hào) int
declare @前一個(gè)工作中心 varchar(50)
declare @前一個(gè)序號(hào) int
set @前一個(gè)工作中心='#'

-- 定義游標(biāo)
declare cursorName cursor for
select 工作中心,序號(hào) from #myTempTable

-- 打開(kāi)游標(biāo)
open cursorName

-- 遍歷游標(biāo)
fetch next from cursorName into @工作中心,@序號(hào);
while @@fetch_status=0 begin
    -- print(@工作中心)

    if @前一個(gè)工作中心='#' begin
        set @前一個(gè)工作中心=@工作中心
        set @前一個(gè)序號(hào)=@序號(hào)
    end
    else begin
        if @工作中心='001' begin
            if @前一個(gè)工作中心!='001' begin
                -- 輸出001上的一條記錄
                print(@前一個(gè)工作中心+','+convert(varchar(50),@前一個(gè)序號(hào)))
            end
        end
        else begin
            if @前一個(gè)工作中心!=@工作中心 and @前一個(gè)工作中心='001' begin
                -- 輸出001最后一條
                print(@前一個(gè)工作中心+','+convert(varchar(50),@前一個(gè)序號(hào)))
            end
        end

        set @前一個(gè)工作中心=@工作中心
        set @前一個(gè)序號(hào)=@序號(hào)
    end

    -- 遍歷下一條,一定要加上這句,否則會(huì)一直循環(huán)
    fetch next from cursorName into @工作中心,@序號(hào);
end

-- 關(guān)閉和銷(xiāo)毀游標(biāo)
close cursorName
deallocate cursorName

效果如下

在這里插入圖片描述

到此這篇關(guān)于SqlServer 2022通過(guò)臨時(shí)表和游標(biāo)遍歷方式邏輯處理獲取目標(biāo)數(shù)據(jù)的文章就介紹到這了,更多相關(guān)Sql2022臨時(shí)表和游標(biāo)遍歷數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • SqlServer2012中LEAD函數(shù)簡(jiǎn)單分析

    SqlServer2012中LEAD函數(shù)簡(jiǎn)單分析

    SQL SERVER 2012 T-SQL新增幾個(gè)聚合函數(shù): FIRST_VALUE LAST_VALUE LEAD LAG,今天我們首先來(lái)簡(jiǎn)單分析下LEAD,希望對(duì)大家有所幫助,能夠盡快熟悉這個(gè)聚合函數(shù)
    2014-08-08
  • sql動(dòng)態(tài)行轉(zhuǎn)列的兩種方法

    sql動(dòng)態(tài)行轉(zhuǎn)列的兩種方法

    sql動(dòng)態(tài)行轉(zhuǎn)列的兩種方法,需要的朋友可以參考一下
    2013-04-04
  • SQL REGEXP 正則表達(dá)式詳解

    SQL REGEXP 正則表達(dá)式詳解

    SQL中的正則表達(dá)式(通常表示為REGEXP或RLIKE)是一種強(qiáng)大的模式匹配工具,允許你執(zhí)行復(fù)雜的字符串搜索和匹配操作,本文給大家介紹SQL REGEXP 正則表達(dá)式的相關(guān)知識(shí),感興趣的朋友一起看看吧
    2025-04-04
  • 如何優(yōu)化SQL語(yǔ)句(全)

    如何優(yōu)化SQL語(yǔ)句(全)

    這篇文章主要介紹了如何優(yōu)化SQL語(yǔ)句(全),作為一名程序猿會(huì)寫(xiě)SQL語(yǔ)句是最基本的要求,但是如何寫(xiě)出性能比較高的SQL語(yǔ)句呢,下面小編給大家整理供大家參考,需要的朋友可以參考下
    2015-07-07
  • sqlserver數(shù)據(jù)庫(kù)主鍵的生成方式小結(jié)(sqlserver,mysql)

    sqlserver數(shù)據(jù)庫(kù)主鍵的生成方式小結(jié)(sqlserver,mysql)

    嚴(yán)格講這三種產(chǎn)生方式有一定的交叉點(diǎn),其定位方式將在下面進(jìn)行講解
    2012-07-07
  • sql中的regexp與like區(qū)別實(shí)現(xiàn)

    sql中的regexp與like區(qū)別實(shí)現(xiàn)

    本文詳細(xì)介紹了正則表達(dá)式REGEXP和LIKE語(yǔ)句的用途,使用它們進(jìn)行模式匹配,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • SQL中遇到多條相同內(nèi)容只取一條的最簡(jiǎn)單實(shí)現(xiàn)方法

    SQL中遇到多條相同內(nèi)容只取一條的最簡(jiǎn)單實(shí)現(xiàn)方法

    本文主要介紹SQL中遇到多條相同內(nèi)容只取一條的最簡(jiǎn)單實(shí)現(xiàn)方法,比較實(shí)用,希望能給大家做一個(gè)參考。
    2016-06-06
  • SQL如何實(shí)現(xiàn)MYSQL的遞歸查詢(xún)

    SQL如何實(shí)現(xiàn)MYSQL的遞歸查詢(xún)

    這篇文章主要介紹了根據(jù)遞歸到迭代轉(zhuǎn)化的思路,利用SQL實(shí)現(xiàn)了MYSQL的遞歸查詢(xún),需要的朋友可以參考下
    2015-07-07
  • SQL?Server2000在win10上安裝的方法圖文教程

    SQL?Server2000在win10上安裝的方法圖文教程

    Win10本身是一個(gè)兼容性較好的操作系統(tǒng),有很多人在咨詢(xún)?nèi)绾卧赪indows 10上安裝SQL Server 2000數(shù)據(jù)庫(kù),都沒(méi)有成功過(guò),這篇文章主要給大家介紹了關(guān)于SQL?Server2000在win10上安裝的方法,需要的朋友可以參考下
    2024-05-05
  • SQL Server創(chuàng)建用戶(hù)只能訪問(wèn)指定數(shù)據(jù)庫(kù)和視圖的操作步驟

    SQL Server創(chuàng)建用戶(hù)只能訪問(wèn)指定數(shù)據(jù)庫(kù)和視圖的操作步驟

    本文介紹了如何在SQLServer中創(chuàng)建用戶(hù)并限定其訪問(wèn)權(quán)限,包括創(chuàng)建用戶(hù)、設(shè)置用戶(hù)映射、設(shè)置只能訪問(wèn)指定的數(shù)據(jù)表或視圖、給指定表或視圖賦予具體權(quán)限和檢查權(quán)限等步驟,這種設(shè)置可以防止用戶(hù)訪問(wèn)到過(guò)多不必要的過(guò)程表和過(guò)程視圖,提高數(shù)據(jù)安全性
    2024-10-10

最新評(píng)論

阳朔县| 宁都县| 托克托县| 白银市| 嘉禾县| 和硕县| 北京市| 胶南市| 星子县| 奎屯市| 阿城市| 广河县| 西青区| 仁化县| 文登市| 区。| 固原市| 长寿区| 托里县| 蓝山县| 无锡市| 富宁县| 咸宁市| 大冶市| 东乌| 南充市| 阜新市| 岢岚县| 醴陵市| 罗城| 香河县| 多伦县| 即墨市| 会东县| 康保县| 六安市| 杭锦后旗| 道孚县| 汉中市| 秭归县| 广宁县|