从SSIS包替换SQL Server 2012中的Null值

时间:2016-04-26 23:30:33

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

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

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

例如,我是否为我们有电子邮件地址的客户提供了“email”(varchar(255))列。然后,我如何将每个空值更改为空字符串(''),但是在数百个表中没有明确指定每个空值?

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

2 个答案:

答案 0 :(得分:1)

我已经学到了一些有趣且可能对你有用的东西。

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

INSERT INTO dbo.DefTest DEFAULT VALUES;

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

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:

UPDATE MyTable
SET MyColumn = DEFAULT
WHERE MyColumn IS NULL

我已经确认这有效。

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

答案 1 :(得分:0)

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