2012-02-03 74 views
-1

我正在使用SSIS将Excel文件插入到Sql Server表中。我相信它使用Bulk插入,因此它不会插入'CreationDate'和'ModificationDate'列(两者都是使用getdate()作为默认值的计算列)。SSIS插入不插入计算列

有没有办法解决这个问题?

此外,只是要清楚 - 这两个日期列不是Excel的一部分。这是确切的场景:

我的excel有两列 - 代码和说明。我的SQL Server表有4列Code,Description,CreationDate,ModificationDate。

所以,当SSIS复制数据时,它复制代码和描述,但CreationDate和ModificationDate(它们是SQL Server计算列)都是空的。

+2

通过计算您的意思是“SSIS中的计算列”还是“目标表中具有默认值的常规列”? “计算列”在SQL Server中有精确的含义,这听起来不像它 – gbn 2012-02-03 08:04:06

+0

它是SQL Server中的“计算列”。它使用sqlserver命令getdate() – Prabhuram 2012-02-03 08:05:29

+2

@Prabhuram进行计算 - 事实并非如此。如果*有*一个被定义为'CreationDate as getdate()'的计算列,它将总是返回当前的日期时间。正如gbn暗示的那样,你的意思是这些列有一个默认值。 – 2012-02-03 08:13:15

回答

3

,如果你想日志创建 你应该用正常的柱,以默认约束一个computed column定义为GETDATE()每次查询它的时候会改变。

这也是不可能的计算列填充

因此,假设你的意思是“用默认的正常列”,那么你需要从SSIS stop sending NULL将覆盖默认

这是这里所有的证明:

CREATE TABLE #foo (
    bar int NOT NULL, 
    testCol1Null datetime NULL DEFAULT GETDATE(), 
    testCol1NotNull datetime NOT NULL DEFAULT GETDATE(), 
    testCol2 AS GETDATE() 
    ); 
INSERT #foo (bar, testCol1Null) VALUES (1, NULL); 

SELECT * FROM #foo; 
WAITFOR DELAY '00:00:00.100'; 
SELECT * FROM #foo; 
WAITFOR DELAY '00:00:00.100'; 
SELECT * FROM #foo; 

DROP TABLE #foo; 

假设你正在使用的Bulk Insert Task in SSIS,那么你就需要设置“保持空值= OFF /取消选中”在选择PA GE

1

您应该对指定列(或多个)默认约束得到

col1 datetime default getdate() 

还应该有大头的一个选项插入KEEPNULLS应该被关闭。

Bulk Insert on MSDN:

指定空列应大容量导入操作期间保留的,而不是具有用于插入 列的任何默认值的空值,。有关更多信息,请参阅在批量导入过程中保留空值或使用默认值 。

KEEPNULLS也记载:http://msdn.microsoft.com/en-us/library/ms187887.aspx

0

放在你的数据流派生列,并填充两名失踪列你想要的值。

0

计算列上的值在数据库上并不物理存在,每次SQL Server需要访问它时都会计算它,这就是为什么在插入时无法通知值。

你需要的是一个默认列,如果你不通知任何其他的值,那么这个列是一个默认值。

CreationDate datetime default getdate() 
ModificationDate datetime default getdate()