亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

sqlserver常用知識點備忘錄(持續更新)

2024-07-21 02:50:28
字體:
來源:轉載
供稿:網友
sqlserver常用知識點備忘錄(持續更新)

背景

  一個項目的開發,離不開數據庫的相關操作,表/視圖設計,存儲過程,觸發器等等數據庫對象的操作是非常頻繁的。有時候,我們會查找系統中類似的代碼,然后復制/粘貼進行再進行相應的修改。本文的目的在于歸納、總結sqlserver數據庫的常用操作,并不斷更新。期以備忘!

P1 sql的執行順序

  sql語句是操作數據庫的工具,了解sql的執行順序會極大地幫助我們提高我們編寫的sql的執行效率。見以下代碼:

(8)SELECT (9)DISTINCT  (11)<Top Num> <select list>(1)FROM [left_table](3)<join_type> JOIN <right_table>(2)ON <join_condition>(4)WHERE <where_condition>(5)GROUP BY <group_by_list>(6)WITH <CUBE | RollUP>(7)HAVING <having_condition>(10)ORDER BY <order_by_list>
  1. FROM:對FROM子句中的前兩個表執行笛卡爾積(Cartesian PRoduct)(交叉聯接),生成虛擬表VT1
  2. ON:對VT1應用ON篩選器。只有那些使<join_condition>為真的行才被插入VT2。
  3. OUTER(JOIN):如 果指定了OUTER JOIN(相對于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部聯接把左表標記為保留表,右外部聯接把右表標記為保留表,完全外部聯接把兩個表都標記為保留表)中未找到匹配的行將作為外部行添加到 VT2,生成VT3.如果FROM子句包含兩個以上的表,則對上一個聯接生成的結果表和下一個表重復執行步驟1到步驟3,直到處理完所有的表為止。
  4. WHERE:對VT3應用WHERE篩選器。只有使<where_condition>為true的行才被插入VT4.
  5. GROUP BY:按GROUP BY子句中的列列表對VT4中的行分組,生成VT5.
  6. CUBE|ROLLUP:把超組(Suppergroups)插入VT5,生成VT6.
  7. HAVING:對VT6應用HAVING篩選器。只有使<having_condition>為true的組才會被插入VT7.
  8. SELECT:處理SELECT列表,產生VT8.
  9. DISTINCT:將重復的行從VT8中移除,產生VT9.
  10. ORDER BY:將VT9中的行按ORDER BY 子句中的列列表排序,生成游標(VC10).
  11. TOP:從VC10的開始處選擇指定數量或比例的行,生成表VT11,并返回調用者。

 總的來說,select的列是最后一步被執行的,而From的Table是首先被執行的。

P2 創建帶Try。。。Catch的存儲過程模板

  Copy下面的代碼,然后新建查詢,就可以寫sql語句,執行完后,一個你自己的存儲過程就建立好了!

USE [DB]--設定對應的數據庫GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- AUTHOR:-- DESCRIBE:-- =============================================CREATE PROCEDURE [dbo].[UP_InsertJHBData]   --存儲過程名    (      @CustomerName VARCHAR(50)             --參數    )AS     BEGIN            SET NOCOUNT ON                     --提高性能的,必須要有        DECLARE @Now DATETIME        SET @Now = GETDATE()               --所有操作保證統一時間                BEGIN TRY         --在這里寫SQL        END TRY                BEGIN CATCH                DECLARE @ErrorMessage NVARCHAR(4000) ;            DECLARE @ErrorSeverity INT ;            DECLARE @ErrorState INT ;                               SELECT  @ErrorMessage = ERROR_MESSAGE() ,                    @ErrorSeverity = ERROR_SEVERITY() ,                    @ErrorState = ERROR_STATE() ;            PRINT @ErrorMessage             RAISERROR(@ErrorMessage,  -- Message text.                        @ErrorSeverity, -- Severity.                        @ErrorState     -- State.                        ) ;            RETURN -1 ;        END CATCH    END

P3 創建帶事務的存儲過程模板

  只是將帶Try。。。Catch的存儲過程的模板中加入了事務的控制,使用類似

USE [DB]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- AUTHOR:-- DESCRIBE:-- =============================================CREATE PROCEDURE [dbo].[UP_InsertJHBData]--存儲過程名--參數    (      @CustomerName VARCHAR(50)    )--參數AS     BEGIN           SET NOCOUNT ON ;--提高性能的,必須要有        DECLARE @Now DATETIME ;        SET @Now = GETDATE() ;--所有操作保證統一時間               BEGIN TRY            BEGIN TRANSACTION myTrans ;--開始事務           --在這里寫SQL           COMMIT TRANSACTION myTrans ;--事務提交語句        END TRY                BEGIN CATCH            ROLLBACK TRANSACTION myTrans-- 始終回滾事務            --拋出異常            DECLARE @ErrorMessage NVARCHAR(4000) ;            DECLARE @ErrorSeverity INT ;            DECLARE @ErrorState INT ;            SELECT  @ErrorMessage = ERROR_MESSAGE() ,                    @ErrorSeverity = ERROR_SEVERITY() ,                    @ErrorState = ERROR_STATE() ;            RAISERROR(@ErrorMessage,  -- Message text.                 @ErrorSeverity, -- Severity.                 @ErrorState     -- State.                 ) ;        END CATCH    END

P4 批量插入

  或者生成測試數據,或者填充臨時表,我們都會碰到批量插入表的需求,此時,針對被插入的表是否存在分以下兩種情況:

  1. 被插入的表存在,使用以下sql,達到將表#Table2Name中的ID和Name兩列的數據插入表#Table1Name中
    1. INSERT INTO #Table1Name SELECT ID,NAME FROM #Table2Name
  2. 被插入的表不存在,使用以下sql,達到創建表#Table1Name,并將表#Table2Name中的ID和Name兩列的數據插入表#Table1Name中
    1. SELECT ID,NAME INTO #Table1Name FROM #Table2Name

P5 批量更新

  鏈接兩個表,通過第一張表的數據去批量地更新第二張表,使用以下的sql

         UPDATE  t2               SET     t2.FirstSaleOrderDate = t1.FirstSaleOrderDate ,                       t2.LastSaleOrderDate = t1.LastSaleOrderDate               FROM    #T_ValidSODate t1               INNER JOIN #T_PendingReport t2 ON t1.GiftCardNO = t2.GiftCardNO

P6 循環模板

  在存儲過程中,經常會生成一些臨時表,然后循環臨時表的數據進行處理,以下模板可以幫助伙伴們快速處理此類需求

   --生成帶行號的臨時表數據,并插入臨時表#T_Table中    SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNum,           NAME     INTO #T_Table    FROM TableName        --獲取記錄總數    DECLARE @RecordCount INT = 0        SELECT @RecordCount = COUNT(1) FROM #T_Table                    DECLARE @CurrRowNum INT = 1        --當前行號    DECLARE @CurrName VARCHAR(50)    --當前字段        --循環記錄                WHILE @CurrRowNum <= @RecordCount         BEGIN            --獲取當前記錄            SELECT @CurrName = Name FROM #T_Table WHERE RowNum = @CurrRowNum                        --自定義sql                        SET @CurrRowNum = @CurrRowNum + 1 --到下一條記錄        END 

P7 字符串轉表函數

  下面的函數的功能是將【a;b;c;】這樣的字符串按照【;】進行分割并返回一張表

USE [Util]GO/****** Object:  UserDefinedFunction [dbo].[Func_StringListToTable]    Script Date: 04/08/2014 10:59:53 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author:        -- Create date: -- Description:    將字符串轉換為表 --                調用示例如下                --DECLARE  @StringList NVARCHAR(max)                --SET @StringList='a;b;c;'                --DECLARE @Split VARCHAR(10)                --SET @Split=';'                --SELECT * FROM Util.dbo.[Func_StringListToTable](@StringList,@Split)-- =============================================CREATE FUNCTION [dbo].[Func_StringListToTable]    (      -- Add the parameters for the function here      @StringList NVARCHAR(MAX) ,      @split VARCHAR(10)    )RETURNS @StringTable TABLE    (      ID INT ,      String VARCHAR(MAX)    )AS     BEGIN    -- Fill the table variable with the rows for your result set        DECLARE @i INT        SET @i = 1        WHILE ( CHARINDEX(@split, @StringList) <> 0 )             BEGIN                   INSERT  @StringTable                        ( ID ,                          String                        )                VALUES  ( @i ,                          SUBSTRING(@StringList, 1,                                    CHARINDEX(@split, @StringList) - 1)                        )                   SET @StringList = STUFF(@StringList, 1,                                        CHARINDEX(@split, @StringList)                                        + LEN(@split) - 1, '')                    SET @i = @i + 1            END            IF @StringList <> ''             BEGIN                INSERT  @StringTable                        ( ID, String )                VALUES  ( @i, @StringList )             END         RETURN       END

P8 分組數據集并返回每個組的前n條記錄

  Row_NUMBER()函數用于生成行號;利用PARTITION BY可以將結果集按照指定需求進行分組;最終使用一個簡單的子查詢就能夠獲取每組的前3條數據

SELECT  *FROM    ( SELECT    ROW_NUMBER() OVER ( PARTITION BY ProductNO ORDER BY ProductNO ) AS RowNum ,                    *          FROM      IM.dbo.ItemInfo        ) tWHERE   t.RowNum IN ( 1, 2, 3 )

P9 【用戶自定義表類型】的使用

  您是否碰到過這樣的需求:調用存儲過程的時候傳一張表進去???

在sqlserver數據庫中有一種稱為【用戶自定義表類型】的數據結構,類似表,存儲過程的參數可以定義為【用戶自定義表類型】,代碼調用時可以直接傳入一個List<T>,而存儲過程

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕亚洲综合久久筱田步美| 日韩黄色av网站| 久久的精品视频| 国产女精品视频网站免费| 欧美俄罗斯乱妇| 欧美午夜电影在线| 中文字幕日韩欧美在线| 一区二区欧美日韩视频| 国产精品免费久久久| 亚洲最大的av网站| www.日韩av.com| 国产精品视频公开费视频| 日韩欧美视频一区二区三区| 欧美日韩亚洲网| 国产精品视频网| 国产精品福利无圣光在线一区| 青青青国产精品一区二区| 91精品国产777在线观看| 日韩精品免费在线视频观看| 国产精品久久久久久超碰| 97久久精品国产| 色妞在线综合亚洲欧美| 久久综合色影院| 精品一区二区电影| 欧美成人精品xxx| 草民午夜欧美限制a级福利片| 日韩在线观看免费av| 国产精品黄色av| 亚洲一区二区三区xxx视频| 欧美极品欧美精品欧美视频| 日本久久久久亚洲中字幕| 亚洲a∨日韩av高清在线观看| 亚洲人成在线观看| 亚洲国产欧美一区二区丝袜黑人| 精品国产欧美成人夜夜嗨| 欧美性猛交xxxx乱大交| 琪琪亚洲精品午夜在线| 91午夜在线播放| 欧美电影在线观看高清| 国产精品黄色影片导航在线观看| 欧美黑人xxxx| 欧美一级bbbbb性bbbb喷潮片| 超碰精品一区二区三区乱码| 日韩欧美在线字幕| 欧美国产第一页| 欧美国产乱视频| 久久久亚洲影院你懂的| 992tv在线成人免费观看| 91成人国产在线观看| 精品香蕉一区二区三区| 伊人一区二区三区久久精品| 91色视频在线导航| 国产精品影片在线观看| 伊人亚洲福利一区二区三区| 日韩在线观看免费| 91亚洲精品在线观看| 精品亚洲一区二区三区在线播放| 亚洲偷欧美偷国内偷| 日韩精品在线视频观看| 国产视频精品xxxx| 国产精品欧美激情在线播放| 亚洲成人久久电影| 精品国产美女在线| 亚洲欧洲在线视频| 久久精品小视频| 午夜欧美不卡精品aaaaa| 欧美性极品xxxx娇小| 欧美日韩爱爱视频| 久热精品视频在线观看一区| 欧美视频在线观看免费网址| 成人在线精品视频| 久久69精品久久久久久久电影好| 日本高清不卡在线| 久久69精品久久久久久国产越南| 一二美女精品欧洲| 国产精品日日摸夜夜添夜夜av| 久久久久久久网站| 高清亚洲成在人网站天堂| 国产精品美女免费| 久久精品国产一区| 97在线视频观看| 欧美成人精品在线视频| 久久综合九色九九| 久久国产精品久久精品| 97久久精品人人澡人人爽缅北| 亚洲人在线观看| 日韩综合中文字幕| 中文字幕自拍vr一区二区三区| 性欧美xxxx交| 精品久久久久久中文字幕一区奶水| 成人写真视频福利网| 91亚洲va在线va天堂va国| 国产精品自产拍高潮在线观看| 最近2019中文字幕大全第二页| 日韩h在线观看| 日本不卡免费高清视频| 亚洲福利视频二区| 久久久久久久一| 欧美日韩亚洲高清| 91在线观看免费高清完整版在线观看| 理论片在线不卡免费观看| 欧美成人精品在线播放| 日本高清不卡的在线| 日韩av成人在线观看| 亚洲人成电影网站| 97超碰蝌蚪网人人做人人爽| 欧美久久久精品| 亚洲天堂av在线免费观看| 国产日韩在线播放| 国产精品日韩久久久久| 中文字幕av一区中文字幕天堂| 91九色视频在线| 久久久亚洲成人| 性欧美暴力猛交69hd| 久久中文久久字幕| 亚洲第一中文字幕在线观看| 亚洲最大的av网站| 亚洲无线码在线一区观看| 国产精品成久久久久三级| 欧美精品精品精品精品免费| 国产精品第一第二| 亚洲最大av网| 亚洲一区美女视频在线观看免费| 九九热精品在线| 日韩欧美在线观看视频| 午夜精品一区二区三区在线视频| 午夜免费日韩视频| 成人免费看片视频| 91免费看片网站| 欧美专区在线播放| 亚洲free性xxxx护士白浆| 韩国视频理论视频久久| 欧美xxxx做受欧美.88| 欧美性在线观看| 国产成人一区二区| 这里精品视频免费| 日韩国产欧美精品一区二区三区| 日韩视频精品在线| 欧美第一黄网免费网站| 久久久久久久久中文字幕| 欧美性jizz18性欧美| 日本19禁啪啪免费观看www| 精品视频在线观看日韩| 国产黑人绿帽在线第一区| 精品人伦一区二区三区蜜桃免费| 欧美精品精品精品精品免费| 久久天天躁夜夜躁狠狠躁2022| 668精品在线视频| 欧洲亚洲免费视频| 热久久视久久精品18亚洲精品| 亚洲国产精品va在线看黑人动漫| 奇米成人av国产一区二区三区| 亚洲综合中文字幕在线| 成人国产在线激情| 91精品综合久久久久久五月天| 97色在线播放视频| 日韩毛片中文字幕| 亚洲裸体xxxx| 欧美性受xxxx白人性爽| 亚洲成人av在线| 国产成人精品av| 亚洲国内精品视频| 九九久久综合网站| 国产成人精品a视频一区www|