Ошибка при использовании преобразования Pivot в MS SQL Server 2005 - PullRequest
1 голос
/ 05 января 2009

У меня есть следующая таблица, которую я поворачиваю:

(идентификатор, имя, значение)

1, «ID задачи», 123

1, «Язык», «Java»

2, «ID задачи», 456

Я установил PivotKey в качестве столбца Имя, а PivotedValue - в столбец Значение. Для каждого из моих новых столбцов (идентификатор задачи и язык) я установил их PivotKeyValue как «идентификатор задачи» и «язык» соответственно. Мой пакет работает нормально с вышеуказанными данными, результат операции pivot:

(идентификатор, идентификатор задачи, язык)

1, 123, «Ява»

2, 456, NULL

Однако, когда я запускаю пакет на следующих исходных данных, у меня возникают проблемы:

(идентификатор, имя, значение)

1, NULL, NULL

2, NULL, NULL

Я получаю сообщение об ошибке:

[Pivot [4511]] Ошибка: значение ключа поворота "(Can't Convert to String)" недопустимо. Ошибка [DTS.Pipeline]: Код ошибки служб SSIS DTS_E_PROCESSINPUTFAILED. Метод ProcessInput в компоненте «Pivot» (4511) завершился ошибкой с кодом ошибки 0xC0202090. Указанный компонент возвратил ошибку из метода ProcessInput. Ошибка относится только к компоненту, но является фатальной и приводит к остановке выполнения задачи «Поток данных». Перед этим могут быть сообщения об ошибках с дополнительной информацией о сбое.

Мне кажется, это означает, что операция сводки не может обработать значение NULL в столбце PivotKey «Имя», поскольку она не была настроена для обработки значения. Проблема в том, что я не уверен, как это сделать. Как вы обнаруживаете и обрабатываете значение NULL в свойстве PivotKeyValue столбца вывода (форма «Свойства ввода и вывода»)?

Спасибо за ваше время.

Ответы [ 2 ]

2 голосов
/ 12 января 2009

NULL вызывает проблему, потому что вы не можете установить имя столбца таблицы или набора результатов в NULL, что пытается сделать оператор PIVOT. Вам придется использовать оператор ISNULL для предварительно развернутых (или не развернутых) данных.

ISNULL (,

Обычно вы делаете что-то вроде ISNULL (значение 0).

0 голосов
/ 24 февраля 2009

Я могу воссоздать вашу начальную позицию следующим скриптом:

CREATE TABLE DataTable (Id INT, Имя Nvarchar (40), Значение Nvarchar (40))

INSERT DataTable VALUES (1, «TaskID», «123») INSERT DataTable VALUES (1, «Язык», «Java») INSERT VALUTES DataTable (2, «TaskID», «456»)

SELECT id, [TaskID], [Language] ОТ ( SELECT ID, [Имя], [Значение] ИЗ DataTable ) Как PIVOT (MAX (значение) FOR [Name] IN ([TaskID], [Language])) AS p

DROP TABLE DataTable

Результаты:

id TaskID Language 1 123 Ява 2 456 NULL

Однако, когда я бегу:

CREATE TABLE DataTable (Id INT, Имя Nvarchar (40), Значение Nvarchar (40))

INSERT DataTable VALUES (1, NULL, NULL) INSERT VALUTES DataTable (2, NULL, NULL)

SELECT id, [TaskID], [Language] ОТ ( SELECT ID, [Имя], [Значение] ИЗ DataTable ) Как PIVOT (MAX (значение) FOR [Name] IN ([TaskID], [Language])) AS p

DROP TABLE DataTable

Результаты:

id TaskID Language 1 NULL NULL 2 NULL NULL

Это хорошо работает.

Мне кажется, я что-то упускаю из того, что вы делаете?

...