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