平时开发系统时偶尔会遇到数据超长导致往数据库中保存时出错。

使用下边的脚本可以方便的找出超长的字段。

1.通过正式表创建临时表,修改临时表中varchar、nvarchar的长度为max

  1. declare @temp_table_name varchar(50);
  2. declare @table_name varchar(50);
  3. declare @sql varchar(max);
  4. set @table_name='TableName';--正式表表名:此处需要修改
  5. set @temp_table_name = @table_name+'_temp';--临时表表名:此处需要修改
  6.  
  7. --根据正式表创建临时表
  8. set @sql = 'select * into '+@temp_table_name+' from '+@table_name +' where 1<>1;';
  9. exec(@sql);
  10.  
  11. --修改varchar/nvarchar临时表字段长度为max
  12. set @sql = '';
  13. select @sql=@sql+('alter table '+@temp_table_name+' alter column '+b.name+' '+c.name+'(max);')
  14. from sysobjects a,syscolumns b,systypes c
  15. where a.id=b.id and a.name=@temp_table_name
  16. and a.xtype='U'and b.xusertype=c.xusertype
  17. and c.name in ('varchar','nvarchar')
  18. order by b.colid;
  19.  
  20. exec(@sql);
  21.  
  22. --手动往临时表中写入数据

2.数据手动写入临时表后,查找超长字段

  1. declare @temp_table_name varchar(50);
  2. declare @table_name varchar(50);
  3. declare @sql varchar(max);
  4. set @table_name='TableName';--正式表表名:此处需要修改
  5. set @temp_table_name = @table_name+'_temp';--临时表表名:此处需要修改
  6. --校验临时表是哪个字段超长
  7. create table #col_tab
  8. (
  9. id int,
  10. col_name varchar(100),
  11. col_condition varchar(500)
  12. );
  13.  
  14. insert into #col_tab(id,col_name,col_condition)
  15. select ROW_NUMBER() over(order by b.colid) id,
  16. b.name,
  17. (case c.name when 'nvarchar' then 'len' when 'varchar' then 'datalength' end)+
  18. '('+b.name+')>'+cast((case c.name when 'nvarchar' then b.length/2 when 'varchar' then b.length end) as varchar)
  19. from sysobjects a,syscolumns b,systypes c
  20. where a.id=b.id and a.name=@table_name
  21. and a.xtype='U'and b.xusertype=c.xusertype
  22. and c.name in ('varchar','nvarchar')
  23. order by b.colid;
  24.  
  25. select * from #col_tab ;
  26.  
  27. declare @cnt int ;
  28. select @cnt = COUNT(*) from #col_tab;
  29.  
  30. declare @index int;
  31. declare @col_condition varchar(500);
  32. declare @col_name varchar(100);
  33.  
  34. set @index=1;
  35. while @index<=@cnt
  36. begin
  37. select @col_condition = col_condition,@col_name=col_name from #col_tab where id = @index;
  38. set @sql = 'declare @condition_cnt int;';
  39. set @sql = @sql+'select @condition_cnt=COUNT(*) from '+@temp_table_name+' where '+@col_condition+';';
  40. --set @sql = @sql+'print @condition_cnt;';
  41. set @sql = @sql+'if(@condition_cnt>0)
  42. begin
  43. print ''['+@col_name+']字段超长!'';
  44. end;';
  45. exec(@sql);
  46. set @index=@index+1;
  47. end;
  48.  
  49. drop table #col_tab;

3.新建测试表

  1. CREATE TABLE [dbo].[USERS](
  2. [id] [int] IDENTITY(1,1) NOT NULL,
  3. [name] [varchar](30) NULL,
  4. [password] [varchar](30) NULL,
  5. [roleid] [int] NULL,
  6. PRIMARY KEY CLUSTERED
  7. (
  8. [id] ASC
  9. )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  10. ) ON [PRIMARY]

表截图如下:

修改表名,运行 1.通过正式表创建临时表,修改临时表中varchar、nvarchar的长度为max 脚本

  1. declare @temp_table_name varchar(50);
  2. declare @table_name varchar(50);
  3. declare @sql varchar(max);
  4. set @table_name='USERS';--正式表表名:此处需要修改
  5. set @temp_table_name = @table_name+'_temp';--临时表表名
  6.  
  7. --根据正式表创建临时表
  8. set @sql = 'select * into '+@temp_table_name+' from '+@table_name +' where 1<>1;';
  9. exec(@sql);
  10.  
  11. --修改varchar/nvarchar临时表字段长度为max
  12. set @sql = '';
  13. select @sql=@sql+('alter table '+@temp_table_name+' alter column '+b.name+' '+c.name+'(max);')
  14. from sysobjects a,syscolumns b,systypes c
  15. where a.id=b.id and a.name=@temp_table_name
  16. and a.xtype='U'and b.xusertype=c.xusertype
  17. and c.name in ('varchar','nvarchar')
  18. order by b.colid;
  19.  
  20. exec(@sql);
  21.  
  22. --手动往临时表中写入数据

生成临时表如下:

可以看出varchar的长度修改为了max.

4.修改表名后运行脚本2

  1. declare @temp_table_name varchar(50);
  2. declare @table_name varchar(50);
  3. declare @sql varchar(max);
  4. set @table_name='USERS';--正式表表名:此处需要修改
  5. set @temp_table_name = @table_name+'_temp';--临时表表名
  6. --校验临时表是哪个字段超长
  7. create table #col_tab
  8. (
  9. id int,
  10. col_name varchar(100),
  11. col_condition varchar(500)
  12. );
  13.  
  14. insert into #col_tab(id,col_name,col_condition)
  15. select ROW_NUMBER() over(order by b.colid) id,
  16. b.name,
  17. (case c.name when 'nvarchar' then 'len' when 'varchar' then 'datalength' end)+
  18. '('+b.name+')>'+cast((case c.name when 'nvarchar' then b.length/2 when 'varchar' then b.length end) as varchar)
  19. from sysobjects a,syscolumns b,systypes c
  20. where a.id=b.id and a.name=@table_name
  21. and a.xtype='U'and b.xusertype=c.xusertype
  22. and c.name in ('varchar','nvarchar')
  23. order by b.colid;
  24.  
  25. select * from #col_tab ;
  26.  
  27. declare @cnt int ;
  28. select @cnt = COUNT(*) from #col_tab;
  29.  
  30. declare @index int;
  31. declare @col_condition varchar(500);
  32. declare @col_name varchar(100);
  33.  
  34. set @index=1;
  35. while @index<=@cnt
  36. begin
  37. select @col_condition = col_condition,@col_name=col_name from #col_tab where id = @index;
  38. set @sql = 'declare @condition_cnt int;';
  39. set @sql = @sql+'select @condition_cnt=COUNT(*) from '+@temp_table_name+' where '+@col_condition+';';
  40. --set @sql = @sql+'print @condition_cnt;';
  41. set @sql = @sql+'if(@condition_cnt>0)
  42. begin
  43. print ''['+@col_name+']字段超长!'';
  44. end;';
  45. exec(@sql);
  46. set @index=@index+1;
  47. end;
  48.  
  49. drop table #col_tab;

生成where条件是关键,运行后如下图:

之后循环where条件查找临时表中数据超长字段,使用print打印出超长字段的名字。

此脚本在字段较多的情况下,排查问题非常方便。

SQLServer数据库表字段超长,找到超长字段脚本的更多相关文章

  1. MySQL 按照数据库表字段动态排序 查询列表信息

    MySQL 按照数据库表字段动态排序 查询列表信息 背景描述 项目中数据列表分页展示的时候,前端使用的Table组件,每列自带对当前页的数据进行升序或者降序的排序. 但是客户期望:随机点击某一列的时候 ...

  2. Java之数据库表字段有关键字报错java.sql.SQLSyntaxErrorException

    前两天在开发中遇到一个坑,本来我在快乐的做着增删改查,然后悲剧发生了,在查询数据库的过程中,报了java.sql.SQLSyntaxErrorException: 经过排查,是因为数据库表字段中存在关 ...

  3. 关于解决SpringDataJpa框架实体类表字段创建顺序与数据库表字段展示顺序不一致的问题

    今天在公司的项目开发中,遇到一个问题: 后端对象实体类中写入字段顺序与数据库中的存储顺序不一致. 仔细观察到数据库中的表字段的排序方式是按照拼音字母的顺序abcdef......来存储的 而我的实体类 ...

  4. 获得SQLSERVER的表字段等架构信息

    获得SQLSERVER的表字段等架构信息 SELECT 表名 = CASE WHEN A.COLORDER=1 THEN D.NAME ELSE '' END, 表說明 = CASE WHEN A.C ...

  5. mysql 数据库 表字段添加表情兼容

    项目中的几个需要支持Emoji表情符号,手机自带的表情,其实添加也很简单: 1 修改数据库 配置my.cnf  init-connect='SET NAMES utf8mb4'             ...

  6. sqlserver 列出表字段和字段说明

    --表描述SELECT tbs.name 表名,ds.value 描述 FROM sys.extended_properties dsLEFT JOIN sysobjects tbs ON ds.ma ...

  7. YbSoftwareFactory 代码生成插件【十九】:实体类配合数据库表字段进行属性扩展的小技巧

    实体类通常需要和数据库表进行了ORM映射,当你需要添加新的属性时,往往同时也需要在数据库中添加相应的字段并配置好映射关系,同时可能还需对数据访问组件进行重新编译和部署才能有效.而当你开始设计一个通用数 ...

  8. mysql创建外键出错(注意数据库表字段排序)

    1.  两个字段的类型或者大小不严格匹配.例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint.另外,你还必须确定两个字段是否一个为 sig ...

  9. mysql数据库表字段使用DESC等关键字报错及解决方法

    <!-- desc是MySQL数据库的关键字,作为字段名直接使用会报错 --><sql id="Base_Column"> id,mol,ip,port,n ...

随机推荐

  1. c# json 排版

    public static string PraseToJson(string json) { try { JsonSerializer s = new JsonSerializer(); JsonR ...

  2. About ListView

    这一篇整理一些ListView的基本知识. PartA翻译自API Guide: (A)API Guide 使用Adapter建立(bind)Layout 当layout内容是动态的或者不是预先决定好 ...

  3. AtCoder AGC #2 Virtual Participation

    在知乎上听zzx大佬说AGC练智商...于是试了一下 A.Range Product 给$a$,$b$,求$\prod^{b}_{i=a}i$是正数,负数还是$0$ ...不写了 B.Box and ...

  4. 每天一个linux命令(5):mkdir命令

    版权声明更新:2017-05-09博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下命令mkdir. 2 ...

  5. ACM学习历程——HDU3333 Turing Tree(线段树 && 离线操作)

    Problem Description After inventing Turing Tree, 3xian always felt boring when solving problems abou ...

  6. dataguard类型转换与模式转化

    修改数据保护模式步骤 前提:是否满足转换模式的配置要求 最大保护(Maximum Protection):Standby Database 必须配置Standby Redo Log,Primary D ...

  7. Python之常用模块(一)

      time & datatime 模块 random os sys shutil json & picle   time & datetime 时间戳(1970年1月1日之后 ...

  8. Redux API之combineReducers

    combineReducers(reducers) 随着应用变得复杂,需要对 reducer 函数 进行拆分,拆分后的每一块独立负责管理 state 的一部分. combineReducers 辅助函 ...

  9. 拓展kmp模板

    算法描述:设字符串T,长度为n,字符串S,长度为m.在线性时间内求出T的每一个后缀所对应S的最长前缀. 假设T=“AAAAB”,S="AAAA". //拓展KMP ; //字符串长 ...

  10. 蜂窝网络TDOA定位方法的Fang算法研究及仿真纠错

    科学论文为我们提供科学方法,在解决实际问题中,能极大提高生产效率.但论文中一些失误则可能让使用者浪费大量时间.自己全部再推导那真不容易,怀疑的成本特别高,通常不会选择这条路.而如果真是它的问题,其它所 ...