【问题标题】:Replacing Null values in SQL Server 2012 from SSIS Package从 SSIS 包替换 SQL Server 2012 中的 Null 值
【发布时间】:2016-04-26 23:30:33
【问题描述】:

我有一个 SSIS 包,它从平面文件中读取数据并将其写入 sql server 2012 数据库。数据包含某些字段的空值。我想保留具有空值但用默认值替换它们的行,而不必对每一列进行转换(许多表中有数百列)。

是否有任何 sql 命令/脚本来更新一组表中的任何空值,默认值基于数据类型而不考虑列?或者,在 SSIS 2012 中是否有一种方法可以用默认值替换任何 null 而无需对每列进行数据转换?

例如,我是否要为我们拥有电子邮件地址的客户设置“电子邮件”列 (varchar(255))。然后如何将这些空值中的每一个更改为一个空字符串 (''),但跨越数百个表而不明确指定每个表?

我已经尝试在表定义中使用默认值,但它仍然使用 NULL 值,因为它们是显式发送的。

【问题讨论】:

    标签: sql-server ssis sql-server-2012 ssis-2012


    【解决方案1】:

    嗯,我学到了一些有趣的东西,可能对你有用。

    我已经知道可以用这个插入一行所有的 DEFAULT 值:

    INSERT INTO dbo.DefTest DEFAULT VALUES;
    

    您的问题让我想知道是否有类似的方法可以将值更新为默认值。所以我尝试了这个实验:

    CREATE TABLE dbo.DefTest (
       Id int NULL DEFAULT (0)
     , AStr varchar(15) NULL DEFAULT ('A')
     , BStr varchar(15) NULL DEFAULT ('B')
     , TF bit NULL DEFAULT (0)
     , Amount money NULL DEFAULT (100.00)
     );
    
    INSERT INTO dbo.DefTest VALUES (1,'Test','Test',1,20);
    INSERT INTO dbo.DefTest DEFAULT VALUES;
    INSERT INTO dbo.DefTest VALUES  (NULL,NULL,NULL,NULL,NULL);
    
    SELECT * FROM dbo.DefTest;
    

    SELECT 完全符合您的预期。具有指定值的行、具有所有默认值的行和具有所有 NULL 值的行。

    然后我尝试了这个:

     UPDATE dbo.DefTest
     SET Id = DEFAULT
    

    结果如我所愿:所有行的 Id 值为 0,默认值。

    现在要将每列设置为其默认值,仅当它当前为 NULL 时,我需要使用 CASE 语句,所以我尝试了这个:

     UPDATE dbo.DefTest 
     SET Id=CASE WHEN Id IS NULL THEN DEFAULT ELSE Id END
     , AStr = CASE WHEN AStr IS NULL THEN DEFAULT ELSE AStr END
     , BStr = CASE WHEN BStr IS NULL THEN DEFAULT ELSE BStr END
     , TF = CASE WHEN TF IS NULL THEN DEFAULT ELSE TF END
     , Amount = CASE WHEN Amount IS NULL THEN DEFAULT ELSE Amount END
    

    但我得到了:

    关键字“DEFAULT”附近的语法不正确。

    所以我猜 UPDATE 语句只能使用 DEFAULT 作为列值的直接赋值。

    所以要做你想做的事,你只需要为每一个有你想用来替换 NULL 的默认值的列运行一次更新:

    UPDATE MyTable
    SET MyColumn = DEFAULT
    WHERE MyColumn IS NULL
    

    我已验证此方法有效。

    通过查询元视图/表,生成动态sql语句并执行,您可以省去编写数百条语句的麻烦。

    【讨论】:

      【解决方案2】:

      您可以将平面文件中的数据导入到保存表中,然后运行Bulk Insert?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-06
        • 1970-01-01
        • 1970-01-01
        • 2022-11-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多