探索SQL Server元數據(一)

来源:https://www.cnblogs.com/wenBlog/archive/2018/07/13/9306227.html
-Advertisement-
Play Games

簡介 在資料庫中,我們除了存儲數據外,還存儲了大量的元數據。它們主要的作用就是描述資料庫怎麼建立、配置、以及各種對象的屬性等。本篇簡單介紹如何使用和查詢元數據,如何更有效的管理SQLServer 資料庫。 對一些有經驗的資料庫開發和管理人員而言,元數據是非常有價值的。下麵我會介紹一下簡單的原理,然後 ...


簡介

  在資料庫中,我們除了存儲數據外,還存儲了大量的元數據。它們主要的作用就是描述資料庫怎麼建立、配置、以及各種對象的屬性等。本篇簡單介紹如何使用和查詢元數據,如何更有效的管理SQLServer 資料庫。

  對一些有經驗的資料庫開發和管理人員而言,元數據是非常有價值的。下麵我會介紹一下簡單的原理,然後儘量用代碼的方式直接說明,畢竟“talk is cheap show me the code ”。

什麼是動態線上目錄?

  每一個關係型資料庫系統,比如SQL Server 一定要提供關於它的結構的信息,這些信息往往需要通過sql語法來查詢。通常這些信息被保存在指定數據表的結構中。這意味著資料庫中有兩種不同的表:一是用戶自定義的表和系統表或者視圖(包含元數據)。從SQL Server 2005開始,只有視圖可以查詢了,不能直接看到數據表了。

 

系統視圖

這種系統表或者視圖的結合通常參考關係型資料庫理論的文獻叫做作為系統目錄或者數據字典。

在資料庫內部,有一些系統表一直追蹤資料庫中發生的每一件事情。系統表存儲像表、活動、列、索引等事情。這些完全符合Edgar Codd 的關係型資料庫試試的十三條準則直譯。這個準則就是定義動態線上目錄,它就是“關於數據的數據”,也叫作元數據。

 Edgar Codd  準則4, 描述如下:

‘The database description is represented at the logical level in the same way as ordinary data, so that authorized users can apply the same relational language to its interrogation as they apply to the regular data.’

翻譯:像普通數據一樣,在邏輯層的數據表達了對資料庫的描述,以便於授權用戶能應用相同的SQL語言來查詢元數據,就如同查詢常規數據一樣。

在SQL Server中,可以通過系統視圖或者架構視圖直接訪問動態線上目錄,方便用戶更為快捷的開發和管理資料庫。

如何獲得以上信息?

因為我們不能直接訪問,需要使用視圖和函數來看這些信息。只能看到你許可權內的數據。有更好的方法在用戶資料庫中使用數據定義語言(DDL),這些DDL語句包括CREATE, DROP, ALTER, GRANT, DENY, REVOKE 和sp_rename statements 等。總有一種方法可以使用DDL來修改視圖中的任何信息,即使並不總是顯而易見的。

關係型資料庫使用動態的系統視圖中的數據描述資料庫,但是目前還有沒有標準化。但是有一個包含在每個資料庫內的架構可以讀取這些信息:就是Information Schema

不走運的是,這個架構不足以提供足夠信息,這意味著我們需要使用SQL Server 系統資料庫的視圖和函數來補充信息。接下來需要解釋一些術語和技術,我會儘可能少的細節足以讓大家輕鬆地理解這些示例

如圖所示,如何訪問元數據,及其介面

 

 

 

系統視圖

Information Schema

這個架構是一套視圖,視圖中是當前資料庫的信息。每一個資料庫中都有這個架構,只能看到當前資料庫的對象信息。可以直接訪問這些架構的數據在主要的關係型數據中。其中架構視圖不包含資料庫部署信息。

對於不同的關係型資料庫之間的處理工作這個架構尤其重要。它們非常適合日常工作,例如在訪問錢檢查是否存在,但是如果需要詳細報告則會受到限制。他們還使用一種稍有不同的標準命名法:例如,資料庫被稱為目錄,用戶定義的數據類型被稱為“domain”。

之前看到MSDN上有人警告說不要使用INFORMATION_SCHEMA視圖來確認對象架構,我理解是因為SQL Server允許在不同的架構中有相同的表名字,因此當只有表名稱的時候會有混淆。所以我認為儘管放心使用就好了。

 

相容性視圖

相容性視圖是維護元數據的視圖,在SQL Server 2005之前是有系統表支持的,並且只向後相容。只在2005之後的版本支持對於某些系統表的查詢,例如分區表等,只有部分元數據或者特性是對用戶可見的。對於帶有很多用戶、群組、角色或者2000版本數據類型的資料庫而言,使用相容性視圖是有潛在風險的,因為視圖中有的列存儲了用戶的ID或者類型ID,可能會返回NULL或者觸發溢出。

目錄視圖

目錄視圖提供了關於資料庫架構的信息。它們也被資料庫引擎自己本身使用,尤其在查詢優化環節。因此這些視圖需要更高效的方式來獲取元數據。除了複製、備份、資料庫維護計劃或SQL Server代理目錄數據之外,所有元數據都通過這些編目視圖公開。

這些視圖用一種相當特殊的方式排列,SQL Server對象的共有信息都保存在sys.objects裡面。有許多派生視圖,比如外鍵、約束、服務隊列、表、視圖和過程,這些視圖用特定於被編目的對象類型的信息來補充一般的對象信息

並非SQL Server元數據中的所有內容都是對象。例如,一個列、索引或分佈統計信息不是對象。一些如主鍵約束或擴展屬性有一個奇怪的兩面性,因為它們被被當做為一個對象,當被強制鍵索引的實例化時,它就不是一個對象。有些對象(主要是約束)與另一種類型的對象具有父/子關係;父即表。

數據層應用程式視圖

數據層應用程式視圖被用於訪問註冊伺服器信息。特殊版本的伺服器和信息用來檢查這些版本是否漂移。這是一種作為容易的檢查當前註冊資料庫版本的方式,直接用T-SQL查詢。

動態管理視圖和功能(DMVs)

DMV一般用來調優,診斷問題和監控資料庫伺服器狀態。最重要的作用就是提供了一種方式來查詢資料庫的使用信息。例如,不僅查詢到索引,而且可以查詢到使用量的排序和耗時等。

元數據function

還有很多元數據函數,如object_name()或col_name(),它們提供關於當前資料庫中的模式作用域對象的信息。通過避免在元數據表達式中進行顯式連接,它們提供了獲取信息的捷徑,因此,當與編目視圖一起使用時,它們可以幫助您更快地獲取關於元數據的信息。

目錄存儲過程

有許多存儲過程的主要功能是為SQL Server的ODBC驅動程式提供元數據信息。當您建立ODBC連接時,該信息作為數據對象的集合。但是,這些信息通常是可用的,並且可以像任何其他存儲過程一樣從SQL中使用。它們通常被認為不如目錄視圖有用,因為存儲過程返回的結果必須使用INSERT插入一個表或者表變數中,需要使用INSERT ... EXECUTE 語法。

為什麼元數據視圖和功能很重要?

元數據視圖和函數允許您搜索元數據,提供對資料庫報告和總結,找出誰有許可權查看或改變什麼數據,讓你減少重覆輸入,讓幾乎所有隱藏在SQL Server Management Studio的信息可查詢,使部署腳本更安全,更可靠,找出最近的改變或創建,快速處理一些函數或過程,確定已註冊資料庫的版本,審計用於編碼實踐的資料庫代碼,發現重覆索引並且允許減少低效的點擊操作。當與其他SQL Server工具(如預設跟蹤和動態管理對象)結合使用時,使用強大的SQL腳本用於開發和管理資料庫是相當快速的。

元數據視圖和函數允許執行幾乎不可能執行的操作,例如查找依賴於指定的CLR用戶定義類型或別名類型的參數。

我是如何逐漸使用的?

學習使用元數據視圖和函數的第一階段是收集從各種著名的數據源(如SQL Server Central)中使用它們的查詢。可以在MSDN上查詢到。使用記錄工具保存這些查詢。如果它是一個用來保存註釋或片段的工具,可以讓您在任何地方輕鬆地獲取查詢,那麼它將會有所幫助。一段時間後,就可以根據使用需要對這些查詢稍作修改。然後,不需要在object browser窗格中搜索表列表,您很快就可以從集合中獲取適當的查詢,執行它,並快速獲取信息。

比較有用的查詢實例

下麵我會展示的例子都已經在2008和2012 兩個版本中測試。當然只用到了各自版本的最後一個版本更新後的資料庫。

下圖中展示了所有繼承sys.objects列的視圖。這意味著它們除了擁有這些列以外,還有列的對應類型。這是視圖所有的信息比如create_date也都來自sys.objects

 

 

要列出資料庫中的所有視圖(存儲過程和外鍵),只需執行以下操作 …

 

SELECT  object_schema_name(object_id)+'.'+name FROM sys.views;

 SELECT  object_schema_name(object_id)+'.'+name FROM sys.procedures;

SELECT name AS Foreign_key,
object_schema_name(parent_object_ID)+'.'+object_name(parent_object_ID) AS parent,

object_schema_name(referenced_object_ID)+'.'+object_name(referenced_object_ID) AS referenced


FROM sys.foreign_keys;



 

對於所有其他的,您需要使用一個系統函數來過濾您想要的對象。下麵的代碼提供了一些有用的示例。因為我們只獲取對象的名稱,所以使用sys.objects,它具有所有資料庫對象共有的基本信息的視圖。如果我們需要特定於特定類型對象的信息,比如主鍵是否具有系統生成的名稱,那麼您就必須為該特定類型的對象使用視圖。

/* The Tables */
  --資料庫中的所有用戶表
    SELECT
      ob.name AS User_Table, Coalesce(ep.value, '') AS documentation
    FROM sys.objects AS ob
      LEFT OUTER JOIN sys.extended_properties AS ep
        ON ep.major_id = ob.object_id
           AND ep.class = 1
           AND ep.minor_id = 0
    WHERE ObjectProperty(ob.object_id, 'IsUserTable') = 1 
/* The Views */
  --視圖
  SELECT ob.name AS ViewName, Coalesce(ep.value, '') AS documentation
  FROM sys.objects ob  LEFT OUTER JOIN sys.extended_properties AS ep
      ON ep.major_id = ob.object_id
         AND ep.class = 1
         AND ep.minor_id = 0
  WHERE objectproperty(ob.object_id,'IsView')= 1 


/* The Check Constraints */
 --Check約束
    SELECT
      objects.name AS Name_of_Check_Constraint,
      Object_Schema_Name(objects.parent_object_id) + '.' + Object_Name(objects.parent_object_id) AS parent,
	  Coalesce(ep.value,'') AS documentation
   FROM sys.objects
      LEFT OUTER JOIN sys.extended_properties AS ep
        ON ep.major_id = objects.object_id AND ep.class=1
  	    AND ep.name='MS_Description'--microsoft 公約
    WHERE ObjectProperty(objects.object_id, 'IsCheckCnst') = 1 

/* The Constraints */ 
SELECT --約束 objects.name AS Name_of_Constraint, --see all constraints and parent table Lower(Replace(type_desc,'_',' ')),--the type of constraint Object_Schema_Name(objects.parent_object_id) + '.' + Object_Name(objects.parent_object_id) AS parent, Coalesce(ep.value, '') AS documentation FROM sys.objects LEFT OUTER JOIN sys.extended_properties AS ep ON ep.major_id = objects.object_id AND ep.class = 1 AND ep.name = 'MS_Description' WHERE ObjectProperty(objects.object_id, 'IsConstraint') = 1; /* The Defaults */ --預設 SELECT objects.name, Coalesce(ep.value, '') AS documentation FROM sys.objects LEFT OUTER JOIN sys.extended_properties AS ep ON ep.major_id = objects.object_id AND ep.class = 1 AND ep.name = 'MS_Description' WHERE ObjectProperty(objects.object_id, 'IsDefault') = 1; /* The Default Constraints */ --資料庫及其父表中的所有預設約束 SELECT objects.name AS Name_of_Default_Constraint,--see all Default constraints and parent table Coalesce(ep.value,'') AS documentation, object_schema_name(objects.parent_object_id)+'.'+object_name(objects.parent_object_id) AS parent, Coalesce(EP_parent.value,'') AS documentation FROM sys.objects LEFT OUTER JOIN sys.extended_properties AS ep ON ep.major_id = objects.object_id AND ep.class = 1 AND ep.name = 'MS_Description' --the microsoft convention LEFT OUTER JOIN sys.extended_properties AS EP_parent ON ep.major_id = objects.parent_object_id AND ep.name = 'MS_Description' --the microsoft convention WHERE objectproperty(objects.object_id,'IsDefaultCnst')= 1; /* The Executables */ --資料庫中的所有可執行文件(過程、函數等) SELECT oe.name AS Name_Of_Executable, Replace(Lower(oe.type_desc), '_', ' ') AS Type_Of_Executable, Coalesce(EP.value, '') AS Documentation FROM sys.objects AS oe LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = oe.object_id AND EP.name = 'MS_Description' WHERE ObjectProperty(oe.object_id, 'IsExecuted') = 1; /* The Extended Stored Procedures */ --資料庫中的所有擴展存儲過程 SELECT oep.name AS Name_of_Extended_Procedure, Coalesce(EP.value, '') AS Documentation FROM sys.objects AS oep LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = oep.object_id AND EP.name = 'MS_Description' WHERE ObjectProperty(oep.object_id, 'IsExtendedProc') = 1; /* The Inline Functions */ --資料庫中的所有內聯函數 SELECT ilf.name AS Inline_function, Coalesce(EP.value, '') AS Documentation FROM sys.objects AS ilf LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = ilf.object_id AND EP.name = 'MS_Description' WHERE objectproperty(ilf.object_id,'IsInlineFunction')= 1; /* The Primary Keys */ --資料庫中的所有主鍵及其父表 SELECT pk.name AS Primary_key, Object_Schema_Name(pk.parent_object_id) + '.' + Object_Name(pk.parent_object_id) AS parent, Coalesce(EP.value, '') AS KeyDoc, Coalesce(EPParent.value, '') AS TableDoc FROM sys.objects AS pk LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = pk.object_id AND EP.name = 'MS_Description' LEFT OUTER JOIN sys.extended_properties AS EPParent ON EPParent.major_id = pk.parent_object_id AND EPParent.minor_id = 0 AND EPParent.name = 'MS_Description' WHERE ObjectProperty(pk.object_id, 'IsPrimaryKey') = 1; /* The Stored Procedures */ --資料庫中的所有存儲過程 SELECT sp.name AS Stored_procedure, Coalesce(EP.value, '') AS Documentation FROM sys.objects AS sp LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = sp.object_id AND EP.minor_id = 0 AND EP.name = 'MS_Description' WHERE ObjectProperty(sp.object_id, 'IsProcedure') = 1; /* The Queues */ --資料庫中的所有隊列 SELECT q.name AS QueueName, Coalesce(EP.value, '') AS Documentation FROM sys.objects AS q LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = q.object_id AND EP.name = 'MS_Description' WHERE ObjectProperty(q.object_id, 'IsQueue') = 1; /* The Rules */ --資料庫中的所有舊式規則 SELECT ru.name AS RuleName, --old-fashioned sybase-style rule Coalesce(EP.value, '') AS Documentation FROM sys.objects AS ru LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = ru.object_id AND EP.name = 'MS_Description' WHERE ObjectProperty(ru.object_id, 'IsRule') = 1; /* The Scalar Functions */ --資料庫中的所有標量函數。 SELECT sf.name AS Scalar_function, Coalesce(EP.value, '') AS Documentation FROM sys.objects AS sf LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = sf.object_id AND EP.name = 'MS_Description' WHERE ObjectProperty(sf.object_id, 'IsScalarFunction') = 1; /* The System Tables */ --據庫中的所有系統表 SELECT st.name AS System_table, Coalesce(EP.value, '') AS Documentation FROM sys.objects AS st LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = st.object_id AND EP.name = 'MS_Description' WHERE ObjectProperty(st.object_id, 'IsSystemTable') = 1; --資料庫中的所有表,包括系統表 SELECT at.name AS TableName, Lower(Replace(type_desc,'_',' ')),--約束的類型 Coalesce(EP.value, '') AS Documentation FROM sys.objects AS at LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = at.object_id AND EP.name = 'MS_Description' WHERE ObjectProperty(at.object_id, 'IsTable') = 1; /* The TVFs*/ --資料庫中的所有表值函數 SELECT tvf.name AS Table_Valued_Function, Coalesce(EP.value, '') AS Documentation FROM sys.objects AS tvf LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = tvf.object_id AND EP.name = 'MS_Description' --the microsoft convention WHERE ObjectProperty(tvf.object_id, 'IsTableFunction') = 1; --資料庫及其所有觸發器。 SELECT tr.name AS TriggerName, Object_Schema_Name(tr.parent_object_id) + '.' + Object_Name(tr.parent_object_id) AS parent, Coalesce(EP.value, '') AS TriggerDoc, Coalesce(EPParent.value, '') AS TableDoc FROM sys.objects AS tr LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = tr.object_id AND EP.name = 'MS_Description' LEFT OUTER JOIN sys.extended_properties AS EPParent ON EPParent.major_id = tr.parent_object_id AND EPParent.minor_id = 0 AND EPParent.name = 'MS_Description' WHERE ObjectProperty(tr.object_id, 'IsTrigger') = 1; /* The Unique Constraints */ --資料庫及其父表中的所有惟一約束 SELECT uc.name AS Unique_constraint,--所有唯一的約束 object_schema_name(uc.parent_object_id)+'.'+object_name(uc.parent_object_id) AS parent, Coalesce(EP.value, '') AS ConstraintDoc, Coalesce(EPParent.value, '') AS TableDoc FROM sys.objects AS uc LEFT OUTER JOIN sys.extended_properties AS EP ON EP.major_id = uc.object_id AND EP.name = 'MS_Description' LEFT OUTER JOIN sys.extended_properties AS EPParent ON EPParent.major_id = uc.parent_object_id AND EPParent.minor_id = 0 AND EPParent.name = 'MS_Description' WHERE objectproperty(uc.object_id,'IsUniqueCnst')= 1;

 


 

當然我們也可以調整這些語句來方便我們的精確查找,比如:

--資料庫中的所有視圖在過去兩周內被修改的有:

SELECT name AS ViewName, convert(char(11),modify_date,113)

FROM sys.objects WHERE objectproperty(OBJECT_ID,'IsView')= 1

AND modify_date > dateadd(week,-2, GetDate());

 

--上個月創建的所有對象的名稱和類型

SELECT coalesce(object_schema_name(obj.object_ID)+'.','')+obj.name AS ObjectName,

convert(varchar(30),lower(replace(type_desc,'_',' ')))

FROM sys.objects obj

WHERE create_date > dateadd(month,-1, GetDate());

--DBO架構中所有基本對象的名稱和類型

SELECT coalesce(object_schema_name(obj.object_ID)+'.','')+obj.name AS ObjectName,

convert(varchar(30),lower(replace(type_desc,'_',' '))) as ObjectType

FROM sys.objects obj

WHERE parent_object_ID=0

AND schema_ID = schema_ID('dbo'); 

 

總結

  如上,到這級別簡單實用足夠了。們已經介紹了一般的理論,並介紹了查找資料庫中的內容的基本方法。在下一篇中我將會深入介紹觸發器並且找到有效信息的排序以便於可以通過系統視圖從動態線上目錄中收集的有用信息。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、備份namenode的元數據 namenode中的元數據非常重要,如丟失或者損壞,則整個系統無法使用。因此應該經常對元數據進行備份,最好是異地備份。 1、將元數據複製到遠程站點 (1)以下代碼將secondary namenode中的元數據複製到一個時間命名的目錄下,然後通過scp命令遠程發送到 ...
  • HDFS HA Namenode HA 詳解 hadoop2.x 之後,Clouera 提出了 QJM/Qurom Journal Manager,這是一個基於 Paxos 演算法(分散式一致性演算法)實現的 HDFS HA 方案,它給出了一種較好的解決思路和方案,QJM 主要優勢如下: 不需要配置額外 ...
  • NoSQL:一類新出現的資料庫(not only sql) 泛指非關係型的資料庫 不支持SQL語法 存儲結構跟傳統關係型資料庫中的那種關係表完全不同,nosql中存儲的數據都是KV形式 NoSQL的世界中沒有一種通用的語言,每種nosql資料庫都有自己的api和語法,以及擅長的業務場景 NoSQL中 ...
  • 一、增加MariaDB源 cd /etc/yum.repos.d vi MariaDB.repo # MariaDB 10.1 CentOS repository list - created 2017-04-20 03:29 UTC # http://downloads.mariadb.org/m ...
  • 一、為什麼要做Galera集群非同步複製 Galera集群解決了資料庫高可用的問題,但是存在局限性,例如耗時的事務處理可能會導致集群性能急劇下降,甚至出現阻塞現象。而不幸的是,類似報表等業務需求就需要做數據大批量的數據查詢操作,為了不影響Galera的集群效率,需要做數據非同步複製,產生一個從庫來適配耗 ...
  • 安裝Elasticsearch Elasticsearch下載地址:https://www.elastic.co/cn/downloads/elasticsearch 也可以直接使用wget下載到某目錄下, 本文所有下載的包都放在 /home/tools 中, 解壓後移到 /home/apps目錄下 ...
  • 性能更好的新伺服器申請下來了,我們決定在2台新伺服器上使用mysql5.7,並且使用主從同步、讀寫分離架構,很不幸這個任務落到了我的頭上。讀寫分離是在業務代碼中實現的,在此不做詳述,介紹一下我搭建MySQL主從的過程。 環境介紹: Master 10.20.66.150 Slave 10.20.66 ...
  • 1、cd到mysql安裝目錄bin目錄: 2、輸入id、用戶名和密碼: 3、查看資料庫實例: 4、創建一個實例: 5、刪除一個實例: 6、創建一個表: 7、刪除一個表: 8、表結構: 9、修改表: 你想在一個庫裡面建表的時候 首先你要記得use 使用當前的庫 use庫名 創建表: create ta ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...