SQLServer数据库表字段超长,找到超长字段脚本
平时开发系统时偶尔会遇到数据超长导致往数据库中保存时出错。
使用下边的脚本可以方便的找出超长的字段。
1.通过正式表创建临时表,修改临时表中varchar、nvarchar的长度为max
declare @temp_table_name varchar(50);
declare @table_name varchar(50);
declare @sql varchar(max);
set @table_name='TableName';--正式表表名:此处需要修改
set @temp_table_name = @table_name+'_temp';--临时表表名:此处需要修改 --根据正式表创建临时表
set @sql = 'select * into '+@temp_table_name+' from '+@table_name +' where 1<>1;';
exec(@sql); --修改varchar/nvarchar临时表字段长度为max
set @sql = '';
select @sql=@sql+('alter table '+@temp_table_name+' alter column '+b.name+' '+c.name+'(max);')
from sysobjects a,syscolumns b,systypes c
where a.id=b.id and a.name=@temp_table_name
and a.xtype='U'and b.xusertype=c.xusertype
and c.name in ('varchar','nvarchar')
order by b.colid; exec(@sql); --手动往临时表中写入数据
2.数据手动写入临时表后,查找超长字段
declare @temp_table_name varchar(50);
declare @table_name varchar(50);
declare @sql varchar(max);
set @table_name='TableName';--正式表表名:此处需要修改
set @temp_table_name = @table_name+'_temp';--临时表表名:此处需要修改
--校验临时表是哪个字段超长
create table #col_tab
(
id int,
col_name varchar(100),
col_condition varchar(500)
); insert into #col_tab(id,col_name,col_condition)
select ROW_NUMBER() over(order by b.colid) id,
b.name,
(case c.name when 'nvarchar' then 'len' when 'varchar' then 'datalength' end)+
'('+b.name+')>'+cast((case c.name when 'nvarchar' then b.length/2 when 'varchar' then b.length end) as varchar)
from sysobjects a,syscolumns b,systypes c
where a.id=b.id and a.name=@table_name
and a.xtype='U'and b.xusertype=c.xusertype
and c.name in ('varchar','nvarchar')
order by b.colid; select * from #col_tab ; declare @cnt int ;
select @cnt = COUNT(*) from #col_tab; declare @index int;
declare @col_condition varchar(500);
declare @col_name varchar(100); set @index=1;
while @index<=@cnt
begin
select @col_condition = col_condition,@col_name=col_name from #col_tab where id = @index;
set @sql = 'declare @condition_cnt int;';
set @sql = @sql+'select @condition_cnt=COUNT(*) from '+@temp_table_name+' where '+@col_condition+';';
--set @sql = @sql+'print @condition_cnt;';
set @sql = @sql+'if(@condition_cnt>0)
begin
print ''['+@col_name+']字段超长!'';
end;';
exec(@sql);
set @index=@index+1;
end; drop table #col_tab;
3.新建测试表
CREATE TABLE [dbo].[USERS](
[id] [int] IDENTITY(1,1) NOT NULL,
[name] [varchar](30) NULL,
[password] [varchar](30) NULL,
[roleid] [int] NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
表截图如下:
修改表名,运行 1.通过正式表创建临时表,修改临时表中varchar、nvarchar的长度为max 脚本
declare @temp_table_name varchar(50);
declare @table_name varchar(50);
declare @sql varchar(max);
set @table_name='USERS';--正式表表名:此处需要修改
set @temp_table_name = @table_name+'_temp';--临时表表名 --根据正式表创建临时表
set @sql = 'select * into '+@temp_table_name+' from '+@table_name +' where 1<>1;';
exec(@sql); --修改varchar/nvarchar临时表字段长度为max
set @sql = '';
select @sql=@sql+('alter table '+@temp_table_name+' alter column '+b.name+' '+c.name+'(max);')
from sysobjects a,syscolumns b,systypes c
where a.id=b.id and a.name=@temp_table_name
and a.xtype='U'and b.xusertype=c.xusertype
and c.name in ('varchar','nvarchar')
order by b.colid; exec(@sql); --手动往临时表中写入数据
生成临时表如下:
可以看出varchar的长度修改为了max.
4.修改表名后运行脚本2
declare @temp_table_name varchar(50);
declare @table_name varchar(50);
declare @sql varchar(max);
set @table_name='USERS';--正式表表名:此处需要修改
set @temp_table_name = @table_name+'_temp';--临时表表名
--校验临时表是哪个字段超长
create table #col_tab
(
id int,
col_name varchar(100),
col_condition varchar(500)
); insert into #col_tab(id,col_name,col_condition)
select ROW_NUMBER() over(order by b.colid) id,
b.name,
(case c.name when 'nvarchar' then 'len' when 'varchar' then 'datalength' end)+
'('+b.name+')>'+cast((case c.name when 'nvarchar' then b.length/2 when 'varchar' then b.length end) as varchar)
from sysobjects a,syscolumns b,systypes c
where a.id=b.id and a.name=@table_name
and a.xtype='U'and b.xusertype=c.xusertype
and c.name in ('varchar','nvarchar')
order by b.colid; select * from #col_tab ; declare @cnt int ;
select @cnt = COUNT(*) from #col_tab; declare @index int;
declare @col_condition varchar(500);
declare @col_name varchar(100); set @index=1;
while @index<=@cnt
begin
select @col_condition = col_condition,@col_name=col_name from #col_tab where id = @index;
set @sql = 'declare @condition_cnt int;';
set @sql = @sql+'select @condition_cnt=COUNT(*) from '+@temp_table_name+' where '+@col_condition+';';
--set @sql = @sql+'print @condition_cnt;';
set @sql = @sql+'if(@condition_cnt>0)
begin
print ''['+@col_name+']字段超长!'';
end;';
exec(@sql);
set @index=@index+1;
end; drop table #col_tab;
生成where条件是关键,运行后如下图:
之后循环where条件查找临时表中数据超长字段,使用print打印出超长字段的名字。
此脚本在字段较多的情况下,排查问题非常方便。
SQLServer数据库表字段超长,找到超长字段脚本的更多相关文章
- MySQL 按照数据库表字段动态排序 查询列表信息
MySQL 按照数据库表字段动态排序 查询列表信息 背景描述 项目中数据列表分页展示的时候,前端使用的Table组件,每列自带对当前页的数据进行升序或者降序的排序. 但是客户期望:随机点击某一列的时候 ...
- Java之数据库表字段有关键字报错java.sql.SQLSyntaxErrorException
前两天在开发中遇到一个坑,本来我在快乐的做着增删改查,然后悲剧发生了,在查询数据库的过程中,报了java.sql.SQLSyntaxErrorException: 经过排查,是因为数据库表字段中存在关 ...
- 关于解决SpringDataJpa框架实体类表字段创建顺序与数据库表字段展示顺序不一致的问题
今天在公司的项目开发中,遇到一个问题: 后端对象实体类中写入字段顺序与数据库中的存储顺序不一致. 仔细观察到数据库中的表字段的排序方式是按照拼音字母的顺序abcdef......来存储的 而我的实体类 ...
- 获得SQLSERVER的表字段等架构信息
获得SQLSERVER的表字段等架构信息 SELECT 表名 = CASE WHEN A.COLORDER=1 THEN D.NAME ELSE '' END, 表說明 = CASE WHEN A.C ...
- mysql 数据库 表字段添加表情兼容
项目中的几个需要支持Emoji表情符号,手机自带的表情,其实添加也很简单: 1 修改数据库 配置my.cnf init-connect='SET NAMES utf8mb4' ...
- sqlserver 列出表字段和字段说明
--表描述SELECT tbs.name 表名,ds.value 描述 FROM sys.extended_properties dsLEFT JOIN sysobjects tbs ON ds.ma ...
- YbSoftwareFactory 代码生成插件【十九】:实体类配合数据库表字段进行属性扩展的小技巧
实体类通常需要和数据库表进行了ORM映射,当你需要添加新的属性时,往往同时也需要在数据库中添加相应的字段并配置好映射关系,同时可能还需对数据访问组件进行重新编译和部署才能有效.而当你开始设计一个通用数 ...
- mysql创建外键出错(注意数据库表字段排序)
1. 两个字段的类型或者大小不严格匹配.例如,如果一个是int(10),那么外键也必须设置成int(10),而不是int(11),也不能是tinyint.另外,你还必须确定两个字段是否一个为 sig ...
- mysql数据库表字段使用DESC等关键字报错及解决方法
<!-- desc是MySQL数据库的关键字,作为字段名直接使用会报错 --><sql id="Base_Column"> id,mol,ip,port,n ...
随机推荐
- cookie的保存与提取
爬虫过程中,cookie可以保留用户与服务器之间的交互信息,使服务器与用户相互能够识别.由于HTTP协议是无状态协议,即不能够识别客户端身份,即使客户端多次请求同一个url服务器仍然响应.这种协议导致 ...
- 机器视觉 Local Binary Pattern (LBP)
Local binary pattern (LBP),在机器视觉领域,是非常重要的一种特征.LBP可以有效地处理光照变化,在纹理分析,纹理识别方面被广泛应用. LBP 的算法非常简单,简单来说,就是对 ...
- Win 10 无法打开内核设备“\\.\Global\vmx86”
Win 10操作系统, VMWareWorkstation10 无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件.你想要在安装 VMware Workstation 前重启 ...
- MySQL多个条件以什么表当做主条件表_20161111周五
前两天有事情 停了2天 数据需求:1.活动日期11.8-11.10订单2.单笔订单购买A类产品 B类产品满足68元.且连续3天下单的用户ID 首先第一个条件很简单,主要是第二个条件 第二个条件是 且 ...
- Merge into使用详解( 同时执行inserts和updates操作 )
Merge是一个非常有用的功能,类似于MySQL里的insert into on duplicate key. Oracle在9i引入了merge命令, 通过这个merge你能够在一个SQL语句中对一 ...
- Altium Designer如何从已有的PCB图中导出封装库
1.打开PCB文件 2.选择 Design -> Make Integrated Library (生成集成库) 注意,一定要在PCB 文件下 生成集成库!! 最终生成这个文件,打开这个文 ...
- Runtime.getRuntime()
1转自:https://www.aliyun.com/jiaocheng/849282.html 那就首先说点Runtime类吧,他是一个与JVM运行时环境有关的类,这个类是Singleton的.我说 ...
- 【243】◀▶IEW-Unit08
Unit 8 Environment I. 不定式(to do)在雅思写作中的运用 1)名词 • 主语(句首) To protect the environment is everyone's dut ...
- [poj1741]Tree(点分治+容斥原理)
题意:求树中点对距离<=k的无序点对个数. 解题关键:树上点分治,这个分治并没有传统分治的合并过程,只是分成各个小问题,并将各个小问题的答案相加即可,也就是每层的复杂度并不在合并的过程,是在每层 ...
- 2014 acm鞍山现场赛总结
好像大家都习惯打完比赛写总结,我也来水一发好了.. 记一下流水账,那么多第一次献给了acm,不记一下就白去那么远的地方了.. 首先比赛前网上买了机票跟火车票了.比赛前一天早上6点钟起来收拾东西6点半坐 ...