Проблема U2 Universe SQL SSIS с возвратом данных для определенных столбцов

Я новичок во вселенной U2, поэтому я изучал ее и просматривал документацию, выполняя поиск в stackoverflow, но до сих пор не могу понять, почему оператор select all возвращает только один столбец - @ID. Я пытался сделать эти операторы выбора, используя u2netdk в SSIS.

ВЫБЕРИТЕ * ИЗ АККАУНТА

Я провел еще несколько исследований и обнаружил, что некоторые сообщения с неопределенным описанием столбцов должны быть введены в @. Я не был уверен, что это значит - это @ файл или часть файлового словаря?

Кроме того, мне удалось извлечь словарь файла, в котором перечислены все доступные столбцы, но когда я попытался запросить некоторые столбцы в службах SSIS с помощью диспетчера соединений ADO.NET, возникла ошибка, в которой говорилось, что столбец не найден. Однако, когда я набираю тот же оператор в TCL, он возвращает строки с данными. Почему это происходит?

Спасибо, Джей Ти


person James T    schedule 16.10.2017    source источник


Ответы (2)


Настоящий TL; DR здесь заключается в том, чтобы добавить элемент словаря типа «PH» с именем «@» и поместить туда нужные столбцы. Если вы хотите использовать «SELECT *», вам также потребуется запись «@SELECT». Имейте в виду, что многозначные и однозначные поля могут здесь не работать, потому что их следует рассматривать как отдельные таблицы. Ознакомьтесь с главой 6 документа UniVerse «Администрирование SQL для администраторов баз данных», которая называется «Файлы UniVerse и SQL», чтобы понять это.

Структуры данных в стиле выбора, такие как UniVerse, являются оригинальными NOSQL, поскольку они существовали в прежние времена, когда ANSI SQL еще не был стандартом, а место для хранения метаданных стоило очень и очень дорого.

Выполнение SQL вне UniVerse сложно, потому что типизация данных в SQL определяется явно, тогда как данные и словарь в Universe являются отдельными структурами и хранятся, а иногда даже используются независимо друг от друга. Вы МОЖЕТЕ использовать словарь в качестве своего рода ключа, когда вы читаете или пишете, чтобы выяснить, с каким типом данных вы работаете, но никто не говорит, что вы должны это делать. Кроме того, язык запросов позволяет вам менять словарь, который вы используете, когда захотите, а данные, которые не соответствуют структуре словаря, просто отображаются неожиданным образом, а не фантастически взрываются. Это может быть невероятно освобождающим или привести к безумию, но это уже другая тема.

Чтобы заставить UniVerse хорошо работать с SQL, вы должны определить Dictionary таким образом, чтобы он цеплялся за базовую структуру данных. Когда вы читаете запись из Universe, вы, по сути, считываете полный набор данных с 1 или более таблицами, вложенными до 3 уровней в глубину. В вашем случае я бы взял все поля типа «D» и «I», к которым вы хотите получить доступ, и поместил их в запись «@» PH словаря. В "@" не имеет значения, многозначны они или нет. Это сделает поля доступными для ссылки из SQL, хотя у вас все равно могут возникнуть проблемы с данными в зависимости от вашего словаря.

Если вы хотите сделать "SELECT * FROM foo;" У вас должен быть оператор «@SELECT», который является подмножеством записи «@», содержащей только однозначные поля. Вы захотите сделать записи PH для каждой многозначной ассоциации, содержащей связанные поля, которые нужно захотеть и объединить, а затем получить один унифицированный запрос. Имейте в виду, что даже со всем этим SQL будет иначе реагировать на приглашение TCL, чем через ODBC.

Вот быстрый пример. NAME и EMAIL являются однозначными, а DATE и AMOUNT — многозначными.

@
PH
NAME EMAIL DATE AMOUNT

@SELECT
PH
NAME EMAIL

ORDERS
PH
DATE AMOUNT

Удачи!

person Van Amburg    schedule 16.10.2017
comment
Большое спасибо за подробный пост, теперь все становится намного яснее, но у меня есть еще несколько вопросов относительно ваших примеров. В примере, который вы написали, заказы являются ассоциацией для многозначных данных? Как мне запросить дату и сумму в SQL? Если не имеет значения, что в @ значение многозначно или нет, значит ли это, что я могу поместить туда многозначность и запросить с помощью SQL? И если это возможно, в SQL это уже денормализовано с одиночными значениями? - person James T; 16.10.2017
comment
Здесь все становится немного сложнее. Это зависит от того, как вы запрашиваете вещи. Ответ немного отличается от приглашения TCL, чем через ODBC. Вы можете использовать UNNEST из TCL, но вам нужно выполнить JOIN через ODBC, потому что UNNEST не является допустимой конструкцией SQL за пределами Universe. Таблица ассоциаций называется чем-то вроде file_association, поэтому, если у вас есть файл с именем INVOICE и ассоциация в словаре с именем LINE, это будет INVOICE_LINE. Вам необходимо присоединить INVOICE к INVOICE_LINE по @ID, который упоминается как _ID id ODBC. - person Van Amburg; 16.10.2017
comment
Неудивительно, что UNNEST не работал в SSIS. Теперь все это имеет смысл. Большое спасибо. К сожалению, у меня пока нет репутации 15, иначе вы бы проголосовали за этот пост. Спасибо еще раз! - person James T; 16.10.2017

Похоже, вам нужно обновить запись словаря @SELECT для таблиц/файлов, которые вы хотите запросить. Вам нужно будет заполнить эту запись для каждого файла/таблицы DICT (атрибут 1, разделенный пробелом) всеми полями, которые вы хотите сделать доступными для ODBC/u2netdk.

Когда дело доходит до подготовки вашей базы данных Universe к запросам ODBC/u2netdk, нужно немного настроить. Пожалуйста, взгляните на мой другой ответ для моих рекомендаций по чтению и обработке при настройке вашей базы данных для этого

https://stackoverflow.com/a/40495059/844685

person webthaumaturge    schedule 16.10.2017
comment
Спасибо за ваш ответ, я действительно видел ваш предыдущий ответ, и только прочитав его сейчас, я понял, что вы упомянули, что u2netdk используется совместно с поставщиком ODBC. Я просмотрел документацию по u2netdk и ODBC, но не понял, что есть связь. Теперь все намного яснее. - person James T; 16.10.2017