将“ NULL”作为字符串需要更新的所有行更新为DB NULL

时间:2018-11-08 15:18:40

标签: sql sql-server tsql

是否有一种方法可以更改SQL中某个列中所有出现的值,而与列无关?

我有一个约200列的表,该表是从文本文件导入的。 NULL值作为字符串值'NULL'出现,并出现在表中的大多数列中。有没有办法将这些值转换为真正的NULL值?我想避免可能在每个单独的列上使用UPDATE。

4 个答案:

答案 0 :(得分:2)

一次更新可能不会太痛苦:

show ([] :: [Int])

您可以通过查询update t set col1 = nullif(col1, 'NULL'), col2 = nullif(col2, 'NULL'), . . .; (或类似名称)中的字符串列来在SQL或电子表格中生成代码。

答案 1 :(得分:1)

您可以使用动态sql构建更新脚本...

DECLARE @update_sql NVARCHAR(MAX)= N''

SELECT 
    @update_sql = CONCAT(@update_sql, N',
    mt.', c.name, N' = NULLIF(mt.', c.name, N', ''NULL'')')    
FROM
    sys.columns c
WHERE
    c.object_id = OBJECT_ID(N'dbo.MyTable')
    AND c.collation_name IS NOT NULL; -- easy way to make sure you're only looking at columns that can hold test data. 

SET @update_sql = CONCAT(N'
UPDATE mt SET',
STUFF(@update_sql, 1, 1, ''), N'
FROM 
    dbo.MyTable mt;')

PRINT(@update_sql);

您最终将获得如下格式的输出...

UPDATE mt SET
    mt.column_9 = NULLIF(mt.column_9, 'NULL'),
    mt.column_10 = NULLIF(mt.column_10, 'NULL'),
    mt.column_11 = NULLIF(mt.column_11, 'NULL'),
    mt.column_14 = NULLIF(mt.column_14, 'NULL'),
...
    mt.column_165 = NULLIF(mt.column_165, 'NULL'),
    mt.column_166 = NULLIF(mt.column_166, 'NULL'),
    mt.column_167 = NULLIF(mt.column_167, 'NULL'),
    mt.column_168 = NULLIF(mt.column_168, 'NULL')
FROM 
dbo.MyTable mt;

注意... PRINT命令限制为8000个ASCII字符和4000个unicode字符。因此,如果您注意到输出脚本被截断,请回发,我有一个“长打印”过程可以解决该限制。

答案 2 :(得分:0)

使用merge statement并为所有匹配的行设置null,这是更快,更有效的方式。

答案 3 :(得分:0)

如果不对每个单独的列进行更新,则无法做到这一点。

有编写此类更新的快捷方式,例如右键单击>脚本为...或动态sql,但到目前为止,这并不是您所要求的。