【问题标题】:Data Scrubbing in SQL Server [closed]SQL Server 中的数据清理 [关闭]
【发布时间】:2013-05-22 21:28:37
【问题描述】:

要求是清理数据。我已将平面文件中的数据加载到 SQL Server 表中的某些列中有一些值,例如 -111、-11、-11,即以负值开头,并且有一些空格如何用 a 替换所有这些值我的数据库的所有表都为 NULL?

【问题讨论】:

  • 欢迎来到 stackOverflow。为了帮助回答您的问题,我们希望查看代码 sn-ps、表结构、示例输入/输出、错误消息以及与您的特定问题相关的任何信息。
  • 如果你不了解 SSIS,那你为什么要把它作为一个标签呢?

标签: sql sql-server ssis


【解决方案1】:

如果使用 SQL Server 2012,请使用 TRY_CONVERT 函数转换可以转换的内容,并将其余部分设为 NULL。

TRY_CONVERT(DataType, FieldName) 

如果尝试清理数据,您可以使用 CHARINDEX 来查找无效值,在您的示例中它是 where 条件,或者使用 CHARINDEX 的 CASE 语句:

Fieldname = CASE WHEN CHARINDEX('-',Fieldname) > 0 THEN NULL ELSE Fieldname END

根据您的要求:

DECLARE @Iterator varchar(55),@strSQL VARCHAR(8000) 
DECLARE xyz CURSOR
FOR
--Select stuff to iterate over
SELECT DISTINCT t.name
FROM sys.columns c INNER JOIN
 sys.tables t ON c.object_id = t.object_id INNER JOIN
 sys.schemas s ON t.schema_id = s.schema_id

OPEN xyz 

FETCH NEXT FROM xyz 
INTO @Iterator 

WHILE @@FETCH_STATUS = 0
BEGIN

--Do stuff
SET @strSQL = '         
        DECLARE @Iterator2 varchar(55), @strSQL2 varchar(8000)
        DECLARE xyz2 CURSOR
        FOR
        --Select stuff to iterate over
        SELECT DISTINCT c.name
        FROM sys.columns c INNER JOIN
             sys.tables t ON c.object_id = t.object_id INNER JOIN
             sys.schemas s ON t.schema_id = s.schema_id
        WHERE t.name = '''+@Iterator+'''

        OPEN xyz2 

        FETCH NEXT FROM xyz2 
        INTO @Iterator2 

        WHILE @@FETCH_STATUS = 0
        BEGIN

        --Do stuff
        SET @strSQL2 = ''
        UPDATE '+@Iterator+'
        SET ''+@Iterator2+'' = NULL
        WHERE CHARINDEX(''''-'''',''+@Iterator2+'') <> 0
            ''
        PRINT @strSQL2
            FETCH NEXT FROM xyz2 
            INTO @Iterator2 

        END

        CLOSE xyz2 
        DEALLOCATE xyz2 
        GO
        '       
PRINT (@strSQL)

FETCH NEXT FROM xyz 
INTO @Iterator 

END

CLOSE xyz 
DEALLOCATE xyz 
GO

这个代码非常愚蠢,它会在活动数据库中的每个表的每个字段中将每个“-”更新为 NULL。好吧,以它的当前形式,它只会创建执行此操作的脚本,如果您运行它,然后运行它输出的代码,您将拥有所有更新语句。您可以将 where 条件添加到“选择要迭代的内容”部分,即:WHERE t.name like '%tabletowreck%' 或内部游标 'WHERE c.name like '%badcolumn%'

由于两个游标 'PRINT' 都可以安全运行,我相信如果将两个 PRINT 都更改为 EXEC 会出错,但请注意这可能非常危险。

【讨论】:

  • 如果你真的想“在所有表中用 NULL 替换所有这些值”,你可以使用嵌套游标来做到这一点,但这似乎是一个非常糟糕的主意。如果它是跨多个表的特定字段,那么您可以指定它们并使用单个游标来遍历所有表,如果您愿意,我会写出两个版本...
  • 感谢您的回复 能否请您发布代码。这样我就可以测试它。实际上问题是数据库中有几个表(大约 50 个),而在加载数据时,有些列是负值、空格,所以应该在我的整个数据库中用 null 替换它们。
猜你喜欢
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
相关资源
最近更新 更多