教你解决整理SQL Server输入的数据

我当前的项目中包括一个6200万行、500多列的表。其中的数据来自SQL Server以外,它们到达的表中有一个标识主键,所有剩下的列以varchar(50)形式保存。

问题解决

有许多日期以YYYYMMDD格式保存,这是我注意到的第一个问题。我把这些日期改为整数列。然后我发现许多整数以varchar形式保存,我把它们都改为整数。

接下来,许多列中包含“Y”或“N”或NULL。我们很可能会把它们转换成位列,但这样做存在一个重大的缺陷——你不能索引一个位列。因此,我把它们改成char(1) NULL。

此外,还有一些列中保存有邮政编码,前面一列为五个数字,后面一列为四个数字或NULL。我将它们分别改成char(5)和char(4),都为NULL。

我遇到的另外一个问题是,我无法明白相当一部分列中的内容。我把它们单独处理,为varchar(50)。我希望确定每个varchar列中保存的字符串的最大长度,但要检查6200万行中的所有数据中不切实际的。因此,我选择生成所有列的char或varchar列表。

SELECT
COLUMN_NAME, DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME ='tblArthurClean'
AND DATA_TYPE IN('char','varchar')


我复制结果表中的第一列,把它粘贴到记事本中(这是我最喜欢的文本编辑器,因为它具有优秀的查找-替换功能。)要确定一个特定列中的最长数据,使用下列脚本:

SELECT Max(Len( ColumnName ))
FROM TableName


推而广之,我希望遍历列列表并生成我需要的声明。我把需要的内容集中到一些格式化行中,用一个单独的查询来达到这个目的。

SELECT
',Max(Len( ' + COLUMN_NAME + ' ))
AS ' + COLUMN_NAME
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'tblArthurClean'
AND DATA_TYPE IN( 'char', 'varchar' )


列表A中是一个简短的结果集。现在按照以下步骤执行:

Max(Len( Record_Length_Indicator_or_Filler ))
AS Record_Length_Indicator_or_Filler, 
Max(Len( Job_Number )) AS Job_Number,  
Max(Len( Personal_or_Firm_Name ))
AS Personal_or_Firm_Name,  
Max(Len( Mailing_Address_Supplied_by_Customer


把结果集粘贴到一个文本编辑器中。

在第一行前面插入SELECT。

在文件末尾增加FROM和表的名称。

我在文件开头和末尾添加以下内容。

SELECT GetDate()
GO


然后我删除输出结果第一行前面的逗号,把它保存为一个查询,加载再让它运行。

我对它在我的服务器上的性能非常满意。它只用了一个小时多一点的时间计算出结果——对于分析一个6200万行几百列的表,时间不算太长。

得到的结果是一行结果集,我可以用它作为修改表结构和列名称的指导,并把这些结果与原始表联系起来,做出相应的调整。

本文说明退一步思考如何能够为你节省大量的输入时间。我的座右铭是:“只要SQL能够做的,它都应该完成。”

时间: 2024-08-09 10:54:48

教你解决整理SQL Server输入的数据的相关文章

教你如何使用SQL Server来过滤数据

关系型数据通常以规范化形式保存,就是说你应该尽可能少地重复数据:通常情况下,表与表之间仅通过各种键值实现关联.进一步地讲,规范化的含义就是:你不能在数据库中保存计算后的值,而你只能在需要的时候临时计算数据库中保存的值. 对数据进行某些分析通常是很重要的.比方说,你或许想知道哪些产品的定单最多或者哪些定单的利润最大.这些问题都要求你针对自己的SQL语句创建执行过滤规则的公式.其中最重要的语句之一就是GROUP BY子句. Northwind数据库中的定单 Northwind数据库是包含在SQL S

恢复sql server 2000误删数据的解决办法_MsSql

今天不小心把客户那边的数据库中删了一千多条数据,而且之前又没有备份,真的是很郁闷,后来在网上找到一工具,用起来挺方便,让我躲过一劫. 首先来看一下界面: 输入服务器地址,用户名及密码后点Connect,进入到下面的界面: 在这里选择要恢复数据的数据库,选择Use On-line Log(如果你又备份文件的话就不需要用这个工具了,直接用SQL搞定了).然后点Attach,进入下面的界面: 可以看到左边菜单中有很多功能,我们要恢复数据,首先要查看日志,找出我们误操作的那些日志记录,点Browse下的

恢复sql server 2000误删数据的解决办法

今天不小心把客户那边的数据库中删了一千多条数据,而且之前又没有备份,真的是很郁闷,后来在网上找到一工具,用起来挺方便,让我躲过一劫. 首先来看一下界面: 输入服务器地址,用户名及密码后点Connect,进入到下面的界面: 在这里选择要恢复数据的数据库,选择Use On-line Log(如果你又备份文件的话就不需要用这个工具了,直接用SQL搞定了).然后点Attach,进入下面的界面: 可以看到左边菜单中有很多功能,我们要恢复数据,首先要查看日志,找出我们误操作的那些日志记录,点Browse下的

教你如何提高SQL Server 2000的性能?

以往的服务器,由于内存价格过高,一般配的内存不是很多,超过4G的当然就不多了现在的服务器,配置超过4G就很多,在配作SQL 数据库服务器后,很多的人只选默认的设置,虽然可以正常使用,可是却把大量的内存浪费了(SQL服务使用的内存不会超过1.8G),系统的性能也不能因为的大内存而提升,这是很可惜的. 下面介绍一种方法教你如何提高SQL Server 2000 的性能. 配置的过程如下.(如果服务器的内存少于4G,不用配置) 1.打开系统中的大内存支持(windows) 要启用 Windows 20

直接获取Access、SQL Server等数据库数据

access|server|数据|数据库 直接获取access.SQL Server等数据库数据Author: MixPST,Ph4nt0m Security Teamhttp://www.ph4nt0m.org 当使用SQL注入access的时候,经常会遇到密码为中文.猜不到关键字段名这样的问题.使用本技术就能够很快速的解决这样的问题.本技术最低要求有两条: 1.使用access数据库的系统存在SQL注入漏洞:mssql数据库也支持这个技术2.需要知道欲爆数据所在的表的表名以及这个表下的一个字

SQL Server解析XML数据的方法详解_MsSql

本文实例讲述了SQL Server解析XML数据的方法.分享给大家供大家参考,具体如下: --5.读取XML --下面为多种方法从XML中读取EMAIL DECLARE @x XML SELECT @x = ' <People> <dongsheng> <Info Name="Email">dongsheng@xxyy.com</Info> <Info Name="Phone">678945546</

SQL Server插入中文数据后出现乱码

原文:SQL Server插入中文数据后出现乱码 今天在做项目的过程中遇到如标题的问题,情况如下图: 数据库使用的是SQL Server2012版本,创建表的脚本如下: CREATE TABLE [dbo].[Type](  [TypeId] INT NOT NULL PRIMARY KEY,     [TypeName] NVARCHAR(50)NOT NULL,     [Description] NVARCHAR(255) NULL,     [CategoryId] INT NOT NU

SQL Server解析XML数据的方法详解

本文实例讲述了SQL Server解析XML数据的方法.分享给大家供大家参考,具体如下: --5.读取XML --下面为多种方法从XML中读取EMAIL DECLARE @x XML SELECT @x = ' <People> <dongsheng> <Info Name="Email">dongsheng@xxyy.com</Info> <Info Name="Phone">678945546</

探讨SQL Server并发处理队列数据不阻塞解决方案

前言 之前对于并发这一块确实接触的比较少,自从遇到现在的老大,每写完一块老大都会过目一下然后给出意见,期间确实收获不少,接下来有几篇会来讲解SQL Server中关于并发这一块的内容,有的是总结,有的是学习,若有错误见解请批评性指出. SQL Server并发处理队列数据问题 在我们的项目中对于购买产品的用户会对应分配卡密,同时会更新其卡密的状态为已使用,所以当出现并发时此时我们不加以控制会导致同一个卡号和密码被不同的用户所使用,这样的情况是不能允许的,此时我们迫切需要解决对卡密使用后的更新和产