Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 从SSIS包替换SQL Server 2012中的空值_Sql Server_Ssis_Sql Server 2012_Ssis 2012 - Fatal编程技术网

Sql server 从SSIS包替换SQL Server 2012中的空值

Sql server 从SSIS包替换SQL Server 2012中的空值,sql-server,ssis,sql-server-2012,ssis-2012,Sql Server,Ssis,Sql Server 2012,Ssis 2012,我有一个SSIS包,它从平面文件读入数据并将其写入sql server 2012数据库。数据包含某些字段的空值。我希望保留具有空值的行,但用默认值替换它们,而不必对每一列进行转换(许多表中有数百列) 是否有任何sql命令/脚本可以使用基于数据类型的默认值(不考虑列)跨一组表更新任何空值?或者,SSIS 2012中是否有一种方法可以用默认值替换任何空值,而无需对每列进行数据转换 例如,如果我为有电子邮件地址的客户设置了“email”列(varchar(255))。然后,如何将这些空值中的每一个都更

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

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

例如,如果我为有电子邮件地址的客户设置了“email”列(varchar(255))。然后,如何将这些空值中的每一个都更改为空字符串(“”),但不显式指定每一个,而是跨数百个表


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

您可以将平面文件中的数据导入到保留表中,然后运行一个

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

我已经知道可以使用以下命令插入一行所有默认值:

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会产生您所期望的结果。具有指定值的行、具有所有默认值的行和具有所有空值的行

然后我试了一下:

 UPDATE dbo.DefTest
 SET Id = DEFAULT
 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
结果就是我所希望的:所有行的Id值都是0,这是默认值

现在,为了仅在当前为NULL时将每一列设置为其默认值,我需要使用CASE语句,因此我尝试了以下方法:

 UPDATE dbo.DefTest
 SET Id = DEFAULT
 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作为列值的直接赋值

因此,要执行所需操作,只需对每个具有默认值的列运行一次更新,该默认值用于替换空值:

UPDATE MyTable
SET MyColumn = DEFAULT
WHERE MyColumn IS NULL
我已经证实这是可行的

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