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
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...