2013-04-18 1 views
1

Я столкнулся с этой проблемой, когда попытался загрузить список членов на наш сервер DB2 и создал минимальный пример для объяснения проблемы.Создание таблицы DB2 в SAS добавляет недостающие значения

Чтобы подключить локально созданные таблицы данных из SAS 9.2 к таблицам в нашем хранилище данных DB2 (доступ с подключением к драйверу ODBC), моя процедура заключалась в размещении этих локальных таблиц на одном сервере (другая схема), в котором содержатся претензии. Основная цель этого - отфильтровать список претензий, в которых член_ID содержится в загруженном списке.

Если в первой строке локальных данных отсутствуют значения (иногда у члена может не быть части идентифицирующей информации), данные на локальной стороне теряют несколько не пропущенных значений при загрузке в DB2 схемы. Я привел пример с игрушкой с нечувствительной информацией, чтобы подчеркнуть проблему.

PROC IMPORT OUT= WORK.druglist DATAFILE= "C:\Users\caden2\Desktop\druglist.xls" 
DBMS=EXCEL REPLACE; 
RANGE="'Tab 4# Asthma Meds$'"; 
RUN; 

DATA for_clinical; 
SET druglist(KEEP= Drug_Class Drug_Type Generic GPI); 
IF _N_ = 4 THEN DELETE; 
IF _N_ <= 10; 
IF _N_ = 1 THEN DO; 
    Drug_Class=''; 
    Drug_Type=''; 
    Generic=''; 
    END; 
RUN; 

libname clinic odbc user=XXX password=XXX dsn=DWName schema=DWSchema autocommit=yes; 

PROC SQL; 
DROP TABLE clinic.caden_test; 
CREATE TABLE clinic.caden_test AS 
    SELECT * FROM for_clinical; 
QUIT; 

процедурный ИМПОРТ и шаг данных просто получить данные в форме, мне нужно, и не должно быть никаких проблем. Клиническая библиотека создается через ODBC-соединение с нашим хранилищем данных с моими учетными данными. На скриншоте ниже показано до и после набора данных на локальном компьютере и на клиническом сервере (обратите внимание, что в первой строке есть недостаток). Я не публиковал журнал. Что страшно, так это то, что в моем журнале не было никаких указаний на то, что что-то не так.

enter image description here

Является ли это проблемой с DB2, SAS, или сочетание SAS и DB2? Я не могу реплицировать проблему, идущую от локальной к локальной или DB2-to-DB2. Кроме того, удаленные значения всегда появляются в диагональной формации. С более широкими данными (более 4 переменных) он начинается с произвольной строки и продолжается по диагонали вверх и вправо, пока не достигнет последнего столбца.

Чтобы выразить обеспокоенность BellevueBob в комментариях о том, что это не Viewtable messing up, вот вывод PROC FREQ на клинические данные, показывая, что недостаток действительно есть. enter image description here

Ответ BellevueBob работает в случае, когда недостающие данные являются символами, но создавая таблицу данных таким же образом, но с числовыми данными решение не работает так, как это делается с символьными данными.

+0

Я не был уверен, что это была ошибка с SAS, DB2 или PEBKAC, поэтому я пометил первые два. –

+0

Можете ли вы изменить свой вопрос, чтобы добавить полное заявление SAS 'libname', используемое для' clinic'? Кроме того, уверены ли вы, что таблица DB2 имеет неправильные значения столбцов? 'viewtable' является печально известным. – BellevueBob

+0

Я обновил описание, чтобы подчеркнуть ваши проблемы. Я подвергал цензуре свое имя пользователя, пароль, dsn и схему, но утверждение является довольно ванильным объявлением ODBC. Вызов SQL не дает никаких указаний на то, что «клиника» - это удаленная библиотека или локальная. –

ответ

1

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

Я связался со службой технической поддержки SAS с формулировкой почти идентичной этим вопрос, и это был их ответ:

Это выглядит как вопрос буферного драйвера документированного в следующем SAS Примечания:

http://support.sas.com/kb/38/214.html

Если insertbuff исправляет это, тогда вы можете захотеть увидеть, как получить вместо этого драйвер ODBC для IBM Db2. Дайте мне знать, если это не проблема.

К моему первоначальному примеру решение так же просто, как добавление дополнительной опции в исходный оператор libname. Вместо

libname clinic odbc user=XXX password=XXX dsn=DWName schema=DWSchema autocommit=yes; 

Новое заявление будет

libname clinic odbc user=XXX password=XXX dsn=DWName schema=DWSchema insertbuff=1 autocommit=yes; 

Это исправление работает как для числовых и символьных данных. К счастью, такая проблема с угловым случаем кажется, что она применима только к DB2.

1

Попробуйте использовать параметр Задание NULLCHAR=NO данных:

PROC SQL; 
    DROP TABLE clinic.caden_test; 
    CREATE TABLE clinic.caden_test(NULLCHAR=NO) AS 
    SELECT * FROM for_clinical3; 
QUIT; 

Вот a SAS reference.

Я не использовал DB2 в течение долгого времени и не знаю, как таблицы создаются через ODBC. Тем не менее, я бы также исследовал другие доступные параметры набора данных, в частности DBCREATE_TABLE_OPTS и DBTYPE, которые позволяют явно определять индексы таблиц и столбцов.

EDIT: Исправленный ответ, основанный на комментариях ОП.

Опция NULLCHAR=NO указывает SAS на отправку символа с пробелом в базу данных при вставке отсутствующих значений вместо установки значения в NULL. Хотя это и работает, вероятно, стоит отметить использование SAS.

+0

Возможно, мне придется открыть это снова, но ваше решение работает на моем наборе данных для игрушек. Я попытаюсь запустить его на гораздо большем, гораздо более реальном наборе данных и посмотреть, сохранится ли проблема. В качестве примечания NULLCHAR = YES не устранила проблему. Однако переключение YES на NO устранило проблему. У вас есть достойное объяснение, почему сообщение DB2 о том, что нулевой символ SAS следует рассматривать как val, приведет к тому, что удаление в непустых полях исчезнет? Ваше решение неотличимо от магии ко мне;). –

+0

Я только догадываюсь, но я уверен, что это связано с типами данных столбцов DB2, которые используются при создании таблицы, и, возможно, если они имеют атрибут «NOT NULL». Часто, если вам не удается указать индекс таблицы, используется первый столбец и, по умолчанию, устанавливается значение «NOT NULL». SAS использует одиночную кавычку как символ «отсутствующее значение» (не имея понятия NULL), поэтому использование NULLCHAR = NO указывает SAS на отправку единственного пробела вместо NULL при вставке строк. Чтобы подтвердить, войдите в DB2 с другим приложением и проверьте DDL на таблице. – BellevueBob

+0

Gotta открыть его. Обнаружено, что это решение работает с моими персональными данными, но с использованием числовых данных проблема не была решена (ни NULLCHAR = YES, ни NULLCHAR = NO не работают). –

Смежные вопросы