SQL Server如何查找表名或列名中包含空格的表和列

来源:https://www.cnblogs.com/kerrycode/archive/2018/08/28/9549001.html
-Advertisement-
Play Games

最近發現一個資料庫中的某個表有個欄位名後麵包含了一個空格,這個空格引起了一些小問題,一般出現這種情況,是因為創建對象時,使用雙引號或雙括弧的時候,由於粗心或手誤多了一個空格,如下簡單案例所示: USE TEST;GO --表TEST_COLUMN中兩個欄位都包含有空格CREATE TABLE TES... ...


 

最近發現一個資料庫中的某個表有個欄位名後麵包含了一個空格,這個空格引起了一些小問題,一般出現這種情況,是因為創建對象時,使用雙引號或雙括弧的時候,由於粗心或手誤多了一個空格,如下簡單案例所示:

 

 

USE TEST;
GO
 
--表TEST_COLUMN中兩個欄位都包含有空格
CREATE TABLE TEST_COLUMN 
(
    "ID  "    INT IDENTITY (1,1),
    [Name ]   VARCHAR(32),
    [Normal]  VARCHAR(32)
);
GO
 
--表[TEST_TABLE ]中包含空格, 裡面對應三個欄位,一個前麵包含空格(後面詳細闡述),一個欄位中間包含空格,一個欄位後麵包含空格。
CREATE TABLE [TEST_TABLE ]
(
 
    [ F_NAME]        NVARCHAR(32),
    [M NAME]         NVARCHAR(32),
    [L_NAME ]        NVARCHAR(32)
)
GO

 

 

 

 

那麼要如何找出表名或欄位名包含空格的相關信息呢? 不管是常規方法還是正則表達式,這個都會效率不高。我們可以用一個取巧的方法,就是通過欄位的字元數和位元組數的規律來判斷,如果沒有包含空格,那麼列名的位元組數和字元數滿足下麵規律(表名也是如此):

 

    DATALENGTH(name) = 2* LEN(name)

 

 

 

SELECT  name ,
        DATALENGTH(name) AS NAME_BYTES ,
        LEN(name)         AS NAME_CHARACTER
FROM    sys.columns
WHERE   object_id = OBJECT_ID('TEST_COLUMN');

 

clip_image001

 

 

原理是這樣的,保存這些元數據的欄位類型為sysname ,其實這個系統數據類型,用於定義表列、變數以及存儲過程的參數,是nvarchar(128)的同義詞。所以一個字母占2個位元組。那麼我們安裝這個規律寫了一個腳本來檢查數據中那些表名或欄位名包含空格。方便巡檢。如下測試所示

 

 

 
IF OBJECT_ID('tempdb.dbo.#TabColums') IS NOT NULL
    DROP TABLE dbo.#TabColums;
 
CREATE TABLE #TabColums
(
    object_id            INT ,
    column_id            INT
)
 
INSERT INTO #TabColums
SELECT  object_id ,
        column_id
FROM    sys.columns
WHERE   DATALENGTH(name) != LEN(name) * 2
 
 
SELECT 
    TL.name AS TableName,
    C.Name AS FieldName,
    T.Name AS DataType,
    DATALENGTH(C.name) AS COLUMN_DATALENGTH,
    LEN(C.name) AS COLUMN_LENGTH,
    CASE WHEN C.Max_Length = -1 THEN 'Max' ELSE CAST(C.Max_Length AS VARCHAR) END AS Max_Length,
    CASE WHEN C.is_nullable = 0 THEN '×'  ELSE N'√' END AS Is_Nullable,
    C.is_identity,
    ISNULL(M.text, ''AS  DefaultValue,
    ISNULL(P.value, '') AS FieldComment
    
FROM sys.columns  C
INNER JOIN  sys.types T ON C.system_type_id = T.user_type_id
LEFT  JOIN dbo.syscomments M ON M.id = C.default_object_id
LEFT  JOIN sys.extended_properties P ON P.major_id = C.object_id AND C.column_id = P.minor_id 
INNER JOIN sys.tables TL ON TL.object_id = C.object_id
INNER JOIN #TabColums TC ON C.object_id = TC.object_id AND c.column_id = TC.column_id
ORDER BY C.Column_Id ASC

 

 

 

clip_image002

 

 

那麼為什麼表名TEST_TABLE的三個欄位裡面,前麵包含空格與與中間包含空格都識別不出來呢?這個與資料庫的LEN函數有關係,LEN函數返回指定字元串表達式的字元數,其中

不包含尾隨空格。所以這個腳本是無法排查表名或欄位名前麵包含空格的。如果要排查這種情況,就需要使用下麵SQL腳本(中間包含空格在此略過,這個不符合命名規則):

 

 

 

SELECT * FROM sys.columns WHERE NAME LIKE ' %'  --欄位前麵包含空格。

 

 

 

clip_image003

 

 

其實到了這一步,還沒有完,如果一個實例,裡面有十幾個資料庫,那麼使用上面這個腳本,我要切換資料庫,執行十幾次,對於我這種懶人來說,我覺得無法忍受的。那麼必須寫

一個腳本,將所有資料庫全部檢查完。本來想用sys.sp_MSforeachdb,但是這個內部存儲過程有一些限制,遂寫了下麵腳本。

 

 

 

DECLARE @db_name  NVARCHAR(32);
DECLARE @sql_text NVARCHAR(MAX);
 
DECLARE @db TABLE 
(
    database_name  NVARCHAR(64)
	   

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

-Advertisement-
Play Games
更多相關文章
  • 什麼是數據(Data) 單純的一條記錄並沒有任何意義,如果我們按逗號作為分隔,依次定義各個欄位的意思,相當於定義表的標題 這樣通過表格我們很清楚的知道了某人的詳細信息。 什麼是資料庫(DataBase,簡稱DB) 資料庫即存放數據的倉庫,只不過這個倉庫是在電腦存儲設備上,而且數據是按一定的格式存放 ...
  • 原文地址:http://www.maomao365.com/?p=7335 摘要: 數據表中,有一列是自動流水號,由於各種操作異常原因(或者插入失敗),此列數據會變的不連續,下文將講述使用sql腳本的方式獲取數據表中的數據是否連續的方法分享,如下所示: 實驗環境:sqlserver 2008 R2 ...
  • 使用Sql_server創建表,視圖,觸發器,存儲過程,函數等基本操作。 ...
  • 認識mysql第三篇,發出的內容適合初學者,如果能持續關註我的博客,可以全面的掌握mysql的常用知識,後續我也會陸續發出python相關的知識,關註我,和我一共進步吧! 1、SQL查詢 1、執行順序 3、select ...聚合函數 from 表名 1、where ... 2、group by . ...
  • MySql的前戲 在學習Mysql之前,我們先來想一下一開始做的登錄註冊案例,當時我們把用戶的信息保存到一個文件中: 上面文件內容的規則是我自己定義的,你要想用我這個程式,必須按照我的規則去執行,但凡不是這個規則,就沒有交流的餘地。 在一開始的時候文件格式的規定是沒有規範的,後面學到模塊的時候逐漸知 ...
  • 簡介 Kafka經常用於實時流數據架構,用於提供實時分析。本篇將會簡單介紹kafka以及它為什麼能夠廣泛應用。 簡介 Kafka經常用於實時流數據架構,用於提供實時分析。本篇將會簡單介紹kafka以及它為什麼能夠廣泛應用。 kafka的增長是爆炸性的。2017年超過三分之一的世界五百強公司在使用ka ...
  • 一.mysql 連接工具 在mysq提供的工具中,DBA使用最頻繁的莫過於mysql。這裡的mysql是指連接資料庫的客戶端工具。 1.1 連接選項 -u, -- user=name 指定用戶名 -p ,--password[=name] 指定密碼 -h ,--host=name 指定伺服器IP或者 ...
  • 使用此命令首先確保你的mysql運行環境已經搭建好 這是客戶端連接mysql伺服器的指令,比較全的寫法是下麵兩種 第一個是全拼,第二個是第一個的縮寫 mysql --host=localhost --user=myname --password=password mydb mysql -h loca ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...