-4

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

4

1 回答 1

1

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

TRY_CONVERT(DataType, FieldName) 

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

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 都更改为 EXEC,它会出错,但请注意这可能非常危险。

于 2013-05-22T21:51:06.983 回答