SSIS Выполнить SQL Задача, не выполняющая простой T- SQL правильно - PullRequest
0 голосов
/ 24 января 2020

У меня есть пакет служб SSIS с задачей «Выполнить» SQL, которая выполняет следующий запрос:

SELECT startDate = ISNULL (MAX (c.FileDate), DATEADD (dd, -8, GETDATE ())) 
     , endDate = GETDATE ()
     , fileDate = CAST(FORMAT (GETDATE (), 'yyyyMMddHHmmss') AS VARCHAR(16))
FROM stage.MI_ChildSupportFile c
WHERE RecordType = 3
      AND RecordSent = 1;

В таблице MI_ChildSupportFile нет данных, поэтому «DATEADD (dd, -8, GETDATE ()» "выполняется ли код для startDate.

Когда я запускаю его в SSMS, он работает правильно.

Однако, когда я запускаю пакет, endDate и fileDate верны, но startDate неверно. startDate обычно на несколько минут или несколько часов меньше, чем endDate.

Я проверил случайные переменные, параметры, жестко заданные значения и т. д. c., но не нашел причин для startDate неверно при запуске в SSIS.

Я использую Microsoft SQL Server 2014 - v12.0.2000.8 (X64) и Visual Studio 2019 (версия 16.4.3).

Я потратил около 8 часов на то, чтобы попробовать все, о чем я могу подумать (используя COALESCE вместо ISNULL, используя startDate = (SELECT ...) и т. Д. c.), Но все, что я изменяю, не имеет никакого значения.

Я пришел к выводу, что это может быть ошибка служб SSIS.

Имеет все когда-нибудь видели что-нибудь подобное? Я в своем уме и не уверен, что попробовать дальше. Я гуглил это, но безрезультатно.

Любые предложения / советы приветствуются,

Бретт

Ответы [ 2 ]

0 голосов
/ 26 января 2020

Вы не объяснили, как вы сохраняете результаты в запросе. Есть ли оператор вставки перед оператором выбора?

Я бы проверил следующее, чтобы сузить проблему:

  1. Проверьте соединение, используемое задачей Execute Sql. Проверьте его выражения, чтобы увидеть, строится ли его строка подключения во время выполнения, чтобы убедиться, что она не подключается к какому-либо dev, test или другому серверу prod, где в таблице действительно есть данные.

Если соединение установлено c и указывает на тот же сервер, что и сервер SSMS, выполните Шаг 2.

а. Проверьте, есть ли в таблице в вашем запросе или таблице, в которой хранятся ваши выходные данные, какой-либо триггер, который каким-либо образом касается столбца StartDate. б. Проверьте выражения задачи execute sql и убедитесь, что запрос не генерируется динамически или не связан с некоторыми переменными.

Если ответ отрицательный, go к шагу 3.

Создайте реплику таблицы с _temp и реплику таблицы (если есть), где вы храните свои выходные данные, и используйте их в своем запросе в задаче execute sql. Вы можете повторить проблему?
0 голосов
/ 25 января 2020

Убедитесь, что набор результатов загружен в переменную правильного типа. В этом случае startdate следует загружать в переменную с DateTime.

Я создал таблицу

CREATE TABLE [dbo].[MI_ChildSupportFile](
    [FileDate] [datetime] NULL,
    [RecordType] [int] NULL,
    [RecordSent] [int] NULL
) ON [PRIMARY]

и выполнил ваш точный запрос в SQL Задача пакета SIS на VS2017 для SQL Server 2016. Начальная дата была ожидаемой. Ниже приведены наблюдения VS трех переменных, которые получают набор результатов запроса, когда у MI_ChildSupportFile нет данных.

User::startdate {1/16/2020 10:23:50 PM} DateTime
User::enddate {1/24/2020 10:23:50 PM}   DateTime
User::filedate {20200124222350} String

Кроме того, пакет работает правильно, когда в таблице есть записи.

...