千家信息网

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

发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章给大家分享的是有关SQL Server如何查找表名或列名中包含空格的表和列的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。如下案例所示:USE TEST;GO --表
千家信息网最后更新 2025年11月13日SQL Server如何查找表名或列名中包含空格的表和列

这篇文章给大家分享的是有关SQL Server如何查找表名或列名中包含空格的表和列的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

如下案例所示:

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_CHARACTERFROM sys.columnsWHERE 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 #TabColumsSELECT object_id ,  column_idFROM sys.columnsWHERE 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 CINNER JOIN sys.types T ON C.system_type_id = T.user_type_idLEFT JOIN dbo.syscomments M ON M.id = C.default_object_idLEFT 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_idINNER JOIN #TabColums TC ON C.object_id = TC.object_id AND c.column_id = TC.column_idORDER BY C.Column_Id ASC

那么为什么表名TEST_TABLE的三个字段里面,前面包含空格与与中间包含空格都识别不出来呢?这个与数据库的LEN函数有关系,LEN函数返回指定字符串表达式的字符数,其中

不包含尾随空格。所以这个脚本是无法排查表名或字段名前面包含空格的。如果要排查这种情况,就需要使用下面SQL脚本(中间包含空格在此略过,这个不符合命名规则):

SELECT * FROM sys.columns WHERE NAME LIKE ' %' --字段前面包含空格。

其实到了这一步,还没有完,如果一个实例,里面有十几个数据库,那么使用上面这个脚本,我要切换数据库,执行十几次,对于我这种懒人来说,我觉得无法忍受的。那么必须写

一个脚本,将所有数据库全部检查完。本来想用sys.sp_MSforeachdb,但是这个内部存储过程有一些限制,遂写了下面脚本。

DECLARE @db_name NVARCHAR(32);DECLARE @sql_text NVARCHAR(MAX); DECLARE @db TABLE ( database_name NVARCHAR(64)); IF OBJECT_ID('tempdb.dbo.#TabColums') IS NOT NULL  DROP TABLE dbo.#TabColums; CREATE TABLE #TabColums( object_id   INT , column_id   INT);  INSERT INTO @dbSELECT name FROM sys.databases WHERE state_desc='ONLINE' AND database_id !=2;  WHILE (1=1)BEGIN SELECT TOP 1 @db_name = database_name FROM @db ORDER BY 1;  IF @@ROWCOUNT = 0 RETURN;  SET @sql_text =N'USE ' + @db_name +';      TRUNCATE TABLE #TabColums;       INSERT INTO #TabColums     SELECT object_id ,       column_id     FROM sys.columns     WHERE DATALENGTH(name) != LEN(name) * 2;         SELECT ''' + @db_name + ''' AS DatabaseName,       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 ''√''       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;';  PRINT(@sql_text);   EXECUTE(@sql_text);   DELETE FROM @db WHERE database_name=@db_name; END TRUNCATE TABLE #TabColums;DROP TABLE #TabColums;

另外,对应表名而言,可以使用下面脚本。在此略过,不做过多介绍!

DECLARE @db_name NVARCHAR(32);DECLARE @sql_text NVARCHAR(MAX); DECLARE @db TABLE ( database_name NVARCHAR(64));   INSERT INTO @dbSELECT name FROM sys.databases WHERE state_desc='ONLINE' AND database_id !=2;  WHILE (1=1)BEGIN SELECT TOP 1 @db_name = database_name FROM @db ORDER BY 1;  IF @@ROWCOUNT = 0 RETURN;  SET @sql_text =N'USE ' + @db_name +';               SELECT ''' + @db_name + ''' as database_name, name,        DATALENGTH(name) as table_name_bytes,       LEN(name)   as table_name_character,       type_desc,create_date,modify_date      FROM sys.tables     WHERE DATALENGTH(name) != LEN(name) * 2;     ';  PRINT(@sql_text);   EXECUTE(@sql_text);   DELETE FROM @db WHERE database_name=@db_name; END

感谢各位的阅读!关于"SQL Server如何查找表名或列名中包含空格的表和列"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

空格 字段 数据 脚本 字符 数据库 中包 字节 方法 规律 三个 内容 函数 更多 篇文章 类型 表达式 过程 存储 有关 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全与心理健康检讨 网络安全法保护亮点 mysql数据库怎么看列 云南住建厅网络安全课程 小米互联网科技园设施 oracle标准版数据库 淇县公安局网络技术员 用友安装数据库打开不了 mc端游服务器连接失败 服务器cpu多线程有什么用 公需科目网络安全试卷 我的世界租赁服务器内存不足 乌班图服务器安装显卡驱动 常州品质软件开发使用方法 埋地er腐蚀综合采集仪服务器 在线书城数据库结构 魔兽世界新服务器维克托 梦幻模拟战新区连接服务器失败 数据库sql实验八事务与锁 嵌入式软件开发业余兼职 中小学生网络安全要注意哪些 雅安国家网络安全宣传 黑玛网络技术有限公司 幻塔服务器关闭了 武汉市私瑞网络技术有限公司 ios手机软件开发哪家服务好 校园网络安全检查工作总结报告 php的数据库连接技术 数据库最广泛使用的是什么型 长沙民政软件开发专升本
0