如何在生成INSERT语句时正确处理NULL值并输出对应字符串?
解决SQL拼接INSERT语句时NULL值导致结果为空的问题
在跨数据库数据迁移场景中,通过拼接SQL生成INSERT语句时,若原表列存在NULL值,会导致整条拼接结果直接变为NULL。比如有表t1包含c1、c2列,其中某行的c2值为NULL,执行以下拼接语句:
select 'INSERT INTO t2 (c1, c2) VALUES (''' + c1 + ''', ''' + c2 + ''')' from t1
得到的结果会是NULL,而我们期望生成的INSERT语句中能显式包含NULL关键字。
之前尝试过ISNULL()函数未解决问题,只能通过临时字符串替换的方式处理,现在可以用更简洁的IIF函数来直接处理每一列:
SELECT 'INSERT INTO t2 (c1, c2) VALUES (' + IIF(c1 IS NULL, 'NULL', '''' + c1 + '''') + ', ' + IIF(c2 IS NULL, 'NULL', '''' + c2 + '''') + ')' FROM t1
IIF函数会先判断列值是否为NULL:如果是NULL,就返回不带单引号的NULL字符串;如果不为NULL,就返回用单引号包裹的列值。这样拼接后的语句不会因为某列是NULL而导致整条结果为空,生成的INSERT语句会符合预期。
如果使用的是SQL Server 2012之前的版本(不支持IIF函数),可以用CASE语句替代,效果一致:
SELECT 'INSERT INTO t2 (c1, c2) VALUES (' + CASE WHEN c1 IS NULL THEN 'NULL' ELSE '''' + c1 + '''' END + ', ' + CASE WHEN c2 IS NULL THEN 'NULL' ELSE '''' + c2 + '''' END + ')' FROM t1
内容的提问来源于stack exchange,提问作者Fredrik Thörnblad
相关产品推荐
相关产品推荐

