要求是清理数据。我已经将平面文件中的数据加载到SQL Server表中的某些列中有一些值,如-111,-11,-11,即从负值开始,并且有一些空格,我如何用a替换所有这些值我的数据库的所有表中都为NULL?
答案 0 :(得分:1)
如果使用SQL Server 2012,请使用TRY_CONVERT
函数来转换可以转换的内容,并使用其余的NULL。
TRY_CONVERT(DataType, FieldName)
如果尝试清理数据,可以使用CHARINDEX
查找无效值,在您的示例中,它是标准,或使用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如'%tabletowreck%'或内部游标'WHERE c.name like'%badcolumn%'
由于两个游标'PRINT'这个代码可以安全运行,我相信如果你将PRINT改为EXEC都会出错,但是要小心这可能是非常危险的。