是否有一种方法可以更改SQL中某个列中所有出现的值,而与列无关?
我有一个约200列的表,该表是从文本文件导入的。 NULL值作为字符串值'NULL'出现,并出现在表中的大多数列中。有没有办法将这些值转换为真正的NULL值?我想避免可能在每个单独的列上使用UPDATE。
答案 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,但到目前为止,这并不是您所要求的。