2012-02-03 3 views
-1

Я использую SSIS для вставки файла Excel в таблицу серверов Sql. Я считаю, что он использует вставку Bulk, и в результате он не вставляет в столбцы «CreationDate» и «ModificationDate» (оба из которых являются вычисленными столбцами с getdate() по умолчанию).SSIS Вставки, не вставляющие вычисленные столбцы

Есть ли способ обойти эту проблему?

Также, чтобы быть ясным - обе эти столбцы даты не являются частью excel. Вот точный сценарий:

У меня есть две колонки - код и описание. Моя таблица SQL Server имеет 4 столбца Код, Описание, CreationDate, ModificationDate.

Итак, когда SSIS копирует данные, он копирует код и описание, но значения CreationDate и ModificationDate (которые являются вычисляемыми столбцами SQL Server) являются пустыми.

+2

Вычисленный вы имеете в виду «вычисленный столбец в SSIS» или «обычные столбцы в целевой таблице со значениями по умолчанию»? «Вычисленный столбец» имеет точный смысл в SQL Server, и это звучит не так. – gbn

+0

«Вычислительные столбцы» в SQL Server. Он вычисляется с использованием команды sqlserver getdate() – Prabhuram

+2

@Prabhuram - это не так. Если вы * имели * вычисленный столбец, определенный как «CreationDate as getdate()», он всегда возвращал текущее время. Что вы имеете в виду, так как gbn намекнул, что столбцы имеют значение по умолчанию. –

ответ

3

Вы должны использовать обычный столбец с ограничением в по умолчанию, если вы хотите, чтобы войти творению computed column определяется как GETDATE() будет меняться каждый раз, когда вы запрашиваете его.

Это также невозможно для вычисляемого столбца не быть заселенной

Таким образом, предполагается, что вы имели в виду «нормальный столбец с по умолчанию», то вам необходимо stop sending NULL из SSIS, который имеет приоритет по умолчанию

Это все продемонстрировали здесь:

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, то вам нужно установить «Keep аннулирует = выкл/остановить» на странице настроек

1

Вы должны иметь ограничение по умолчанию для столбца (ов), задающие получить

col1 datetime default getdate() 

Там также должен быть вариантом для массовой вставки KEEPNULLS, который должен быть выключен.

От Bulk Insert on MSDN:

Указывает, что пустые столбцы должны сохранять нулевое значение во время операции массового импорта-, вместо того, чтобы любые значения по умолчанию для столбцов для вставки. Дополнительные сведения см. В разделе Сохранение нулей или использование значений по умолчанию при массовом ввозе.

KEEPNULLS также задокументированы: http://msdn.microsoft.com/en-us/library/ms187887.aspx

0

Put в производный столбец в вашем потоке данных и заполнить две недостающие столбцы со значениями, которые вы хотите.

0

Значение в вычисленном столбце физически не существует в базе данных, оно вычисляется каждый раз, когда SQL Server должен получить к нему доступ, поэтому вы не можете сообщить ему значение вставить.

Что вам нужно, это столбец по умолчанию, который представляет собой столбец, который имеет значение по умолчанию, которое вставлено, если вы не указали другое значение.

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