sql server查詢可編程對象定義的方式對比以及整合

来源:http://www.cnblogs.com/dzy863/archive/2016/09/27/5913682.html
-Advertisement-
Play Games

本文目錄列表: 1、sql server查看可編程對象定義的方式對比 2、整合實現所有可編程對象定義的查看功能的存儲dbo.usp_helptext2 3、dbo.helptext2的選擇性測試 4、總結語 5、參考清單列表 本文目錄列表: 1、sql server查看可編程對象定義的方式對比 2、 ...


本文目錄列表: 1、sql server查看可編程對象定義的方式對比 2、整合實現所有可編程對象定義的查看功能的存儲dbo.usp_helptext2 3、dbo.helptext2的選擇性測試 4、總結語 5、參考清單列表   1、sql server查看可編程對象定義的方式對比   上一篇博文重構sql server的sys.helptext存儲中寫了sys.helptext的限制和輸出格式每行自帶char(13)和char(10)這兩個字元。為了將可編程對象定義查詢方式研究透徹,以下表格列出了查詢可編程對象定義的不同方式的卻別和對可編程對象定義查看的支持程度。
對象類型描述 對象類型簡寫 sys.sp_helptext sys.sql_modules sys.system_sql_modules sys.all_sql_modules object_definition
CHECK_CONSTRAINT C 支持 不支持 不支持 不支持 支持
DEFAULT_CONSTRAINT(contraint,stand-alone) D 支持 支持 不支持 支持 支持
SQL_SCALAR_FUNCTION FN 支持 支持 支持 支持 支持
SQL_INLINE_TABLE_VALUED_FUNCTION IF 支持 支持 支持 支持 支持
SQL_STORED_PROCEDURE P 支持 支持 支持 支持 支持
RULE(old-style,stand-alone) R 支持 支持 不支持 支持 支持
REPLICATION FILTER PROCEDURE RF 支持 支持 支持 支持 支持
SQL_TABLE_VALUED_FUNCTION TF 支持 支持 支持 支持 支持
SQL_TRIGGER TR 支持(除資料庫DDL觸發器和伺服器觸發器外) 支持(除伺服器觸發器外) 不支持 支持(除伺服器觸發器外) 支持(除伺服器觸發器外)
USER_TABLE U computed_column 支持 不支持 不支持 不支持 不支持
VIEW V 支持 支持 支持 支持 支持

註意:

1、帶有_modules的是系統提供的目錄視圖類。 2、sys.sql_modules包括所有用戶定義的可編程對象的,當然也不支持計算列和伺服器觸發器的。 3、sys.system_sql_modules不支持系統定義的類型為C、D、R、TR的對象。 4、sys.all_sql_modules就是sys.sql_modules和sys.system_sql_modules這個視圖的並集結果的,當然也不支持系統定義的類型為C、D、R、TR類型的對象。 5、sys.sp_helptext雖然支持以上表格中除資料庫DDL觸發器和伺服器觸發器之外的可編程對象,但是其輸出格式有限制:1、每行最多225雙位元組字元號,這樣有可能造成輸出將一個標識符分割為前後兩行的。 6、object_definition函數支持以上表格中除伺服器除觸發器和計算列外的可以變成對象。 7、sys.sp_helpttext和object_definition有個功能的限制:1、在SSMS客戶端中如果使用字元串類型變數接收返回的而結果,有可能受制於SSMS客戶端針對字元串變數的最大限制(sql server 2012中的最大限制是43679雙位元組字元長度)不能全部輸出到客戶端,這個缺點可以從通過程式編碼實現得到完美體現。   2、整合實現所有可編程對象定義的查看功能的存儲dbo.usp_helptext2   通過以上幾種方式的對比,我們可以看到那個方式都不能將以上表格中列出的對象類型的定義全部都滿足,為瞭解決這個不足,我們將整合這些功能來封裝在一個存儲(其名稱為dbo.usp_helptext2)。需要註意的一點就是伺服器觸發器本來不是某個資料庫中的對象的,伺服器觸發器和資料庫中可編程對象分開更好的理解,也能簡單些的,不過為了查詢的便利性,我們這次封裝的存儲實現伺服器觸發器定義查看。   功能整合的存儲過程T-SQL代碼如下:
IF OBJECT_ID(N'[dbo].[usp_helptext2]', 'P') IS NOT NULL
BEGIN
    DROP PROCEDURE [dbo].[usp_helptext2];
END
GO
 
--==================================
-- 功能: 查看可編程對象定義
-- 說明: 支持用戶定義類型,可以運行於SQL Server 2005+
-- 創建: yyyy-MM-dd hh:mm-hh:mm XXX 創建內容描述
-- 修改: yyyy-MM-dd hh:mm-hh:mm XXX 修改內容描述
--==================================
CREATE PROCEDURE [dbo].[usp_helptext2]
(
     @nvcObjectName AS NVARCHAR(776)                    -- 對象名稱,可以支持的對象類型為(C、D、FN、IF、P、R、RF、TF、TR、U、V)
    ,@nvcComputedColumnName AS NVARCHAR(128) = NULL        -- 計算列名稱(如果@nvcObjectName的對象類型為U,則該參數表示計算列名稱)
)
AS
BEGIN
    SET NOCOUNT ON;
 
    SET @nvcObjectName = ISNULL(@nvcObjectName, N'');
    IF (@nvcObjectName = N'')
    BEGIN
        RAISERROR(16902, -1, -1,N'usp_helptext2', N'@nvcObjectName');
        RETURN(1);
    END
 
    SET @nvcComputedColumnName = ISNULL(@nvcComputedColumnName, N'');
 
    DECLARE @tntRetVal AS TINYINT;
    SET @tntRetVal = 0;
 
    DECLARE @tblObjDef AS TABLE (
        [Text] NVARCHAR(1000) NULL
    );
 
    DECLARE
         @intObjectID AS INT
        ,@chaType AS CHAR(2)
        ,@nvcText AS NVARCHAR(MAX);
    SELECT
         @intObjectID = 0
        ,@chaType = ''
        ,@nvcText = N'';
    SELECT
         @intObjectID = [object_id]
        ,@chaType = [type]        
    FROM [sys].[all_objects]
    WHERE 
        [type] IN ('C', 'D', 'FN', 'IF', 'P', 'R', 'RF', 'TF', 'TR', 'U', 'V')
        AND [name] = PARSENAME(@nvcObjectName, 1);
 
    IF (@nvcComputedColumnName > N'')    -- 獲取計算列定義
    BEGIN
        IF (@chaType NOT IN ('S', 'U', 'TF'))
        BEGIN
            RAISERROR(15218, -1, -1, @nvcObjectName);
            RETURN(1);
        END
 
        INSERT INTO @tblObjDef ([Text])        
        EXEC [sys].[sp_helptext]
             @objname = @nvcObjectName                -- nvarchar(776)
            ,@columnname = @nvcComputedColumnName    -- sysname
 
        IF(@@ROWCOUNT = 0)
        BEGIN
            SET @tntRetVal = 1;
        END
 
        SELECT 
            @nvcText = ISNULL([Text], N'')
        FROM @tblObjDef;            
    END
    ELSE IF (@intObjectID <> 0)    -- 獲取除計算列和伺服器觸發器以外的所有對象類型的定義
    BEGIN
        SET @nvcText = OBJECT_DEFINITION(@intObjectID);
 
        IF(@@ROWCOUNT = 0)
        BEGIN
            SET @tntRetVal = 1;
        END
    END
    ELSE IF (@intObjectID = 0)    -- 嘗試獲取伺服器觸發器定義
    BEGIN
        SELECT 
            @nvcText = T1.[definition]
        FROM [sys].[server_sql_modules] AS T1
            INNER JOIN [sys].[server_triggers] AS T2
                ON [T1].[object_id] = [T2].[object_id]
        WHERE T2.[name] = @nvcObjectName;
 
        IF(@@ROWCOUNT = 0)
        BEGIN
            SET @tntRetVal = 1;
        END
    END
 
    SELECT 
        @nvcText AS [Text];
 
    RETURN(@tntRetVal);
END
GO
 

 

以上存儲dbo.usp_helptext2可以完全實現以上表格的所有可編程對象定義查看,不論是系統定義的還是用戶定義的,前提是以上表格中的可編程對象類型定義。當然也存在缺點就是可編程對象定義輸出到SSMS客戶端超過最大限制(SQL Server 2012環境中的時43679雙位元組字元長度)就要出現截斷,這個缺點可以通過代碼編程來完美解決這個缺點。   3、dbo.helptext2的選擇性測試
  用戶定義檢查約束測試: 用戶定義約束測試: 系統定義存儲測試: 用戶定義計算列測試:   資料庫DDL觸發器測試 伺服器觸發器測試: 其他對象類型的測試不在全部列舉。   4、總結語   在這次的學習和研究,sql server系統自帶的視圖以及存儲過程針對可編程對象的實現很很完善的,不過葉分散在不同的地方,這次整合也就是將分散在不同地方的聚合在一起提供統一入口來處理。如果不想查看計算列和伺服器觸發器的定義以外的所有可編程對象類型的定義,建議使用object_definition函數,該函數幾乎提供了很完善的功能。這次學習也發現資料庫DDL觸發器在sys.object是無法查看到的,需要在sys.triggers或sys.all_objects目錄視圖中查看到,這個也在object_id函數做了限制的。由於伺服器觸發器本身屬於伺服器的,這個sql server團隊本身也是用了系統表sys.sysschobjs、sys.syspalnames 、sys.syspalvalues,雖然sys.all_objects也是用了系統表sys.syscheobjs,但是卻在sys.all_objects中無法查詢到的,也在object_id函數中做了限制,只能在sys.server_triggers查詢到,這從邏輯上進行了分離,也符合伺服器觸發器的歸屬性質。   希望這個整合的查看可編程對象定義的存儲,可以幫助到需要的人。繼續精進,繼續探究sql server。   5、參考清單列表
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SQL Server 使用的資源受到操作系統的調度,同時,SQL Server在內部實現了一套調度演算法,用於管理從操作系統獲取的資源,主要是對記憶體和CPU資源的調度。一個好的資料庫系統,必定在記憶體中緩存足夠多的信息,以減少從物理硬碟中讀取數據的次數;如果記憶體是系統瓶頸,那麼SQL Server一定會 ...
  • 成都聯通作為合併重組後的中國聯通在成都的分支機構,擁有基礎扎實的通信網路和當前最先進技術的WCDMA網路。隨著3G和4G業務的發展領先,成都聯通憑藉其出色的網路能力和服務,在用戶中贏得了口碑。 ...
  • 總結,int(M) zerofill,加上zerofill後M才表現出有點點效果,比如 int(3) zerofill,你插入到資料庫里的是10,則實際插入為010,也就是在前面補充加了一個0.如果int(3)和int(10)不加zerofill,則它們沒有什麼區別.M不是用來限制int個數的.in ...
  • 1、在安裝過程中,出現的 source /usr/local/greenplum-db/greenplum_path.sh 不要寫到profile或者./bashrc文件中 因為該句會導致python環境變數的改變,致使yum不能正常使用,出現no module named yum問題。 解決辦法: ...
  • 1.概述 從MYSQL5.6 開始,mysql開始支持GTID複製。 基於日誌點複製的缺點: 從那個二進位日誌的偏移量進行增量同步,如果指定錯誤會造成遺漏或者重覆,導致數據不一致。 基於GTID複製: 1.從伺服器會告訴主伺服器已執行的事務的GTID值。 2.主庫會告訴從哪些GTID事務沒有被執行。... ...
  • 目錄: 1.新建資料庫 2.新建數據表 3.查看表結構 4.增刪改查 建立一個資料庫students 建立一塊數據表class1 內容包括: 代碼如下: 1.建立資料庫 2.進入資料庫 3.新建表 4.查看表結構 1.插入(INSERT) 2.修改(UPDATE) 3.刪除(DELETE) 4.查詢 ...
  • Chpt 1 一、基本名詞 1.資料庫:實際上是一個信息列表 2.資料庫程式:虛擬的列表管理員 3.表:只用於存儲一類事情的信息,保持不同信息分類之間的獨立性可以讓資料庫以一種嚴密的組織方式高效地存儲信息 4.行/記錄:每一行都包含一個(且只有一個)由表名稱定義的項目信息 5.列/欄位:包含特定事物 ...
  • 【方法整理】Oracle 獲取trace跟蹤文件名的幾種常用方式 1 BLOG文檔結構圖 2 前言部分 2.1 導讀和註意事項 各位技術愛好者,看完本文後,你可以掌握如下的技能,也可以學到一些其它你所不知道的知識,~O(∩_∩)O~: ① trace跟蹤文件的獲取 Tips: ① 本文在itpub(... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...