我有一个SSIS包,它从平面文件中读取数据并将其写入sql server 2012数据库。数据包含某些字段的空值。我想保留具有空值但是用默认值替换它们的行,而不必对每个列进行转换(在许多表中有数百列)。
是否有任何sql命令/脚本可以使用基于数据类型的默认值更新一组表中的任何null,而不管列是什么?或者,在SSIS 2012中是否有一种方法可以使用默认值替换任何null而不对每列进行数据转换?
例如,我是否为我们有电子邮件地址的客户提供了“email”(varchar(255))列。然后,我如何将每个空值更改为空字符串(''),但是在数百个表中没有明确指定每个空值?
我尝试在表定义中使用默认值,但它仍然使用NULL值,因为它们是显式发送的。
答案 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?