Как мне работать с полями с одинаковыми именами в исходной базе данных, различающимися только по имени метки? - PullRequest
0 голосов
/ 25 марта 2019

Настройка базы данных в моей организации - это таблицы SQL, скопированные на наш сервер SAS.Таблицы SQL были настроены для запуска запрограммированных запросов SQL, теперь SAS - это используемый инструмент.Это, однако, создает проблему с некоторыми таблицами, имеющими переменные, которые слишком длинны для SAS, но работают в SQL.Метка для исходной переменной верна и не укорочена.

The source table (in SQL Server) names:

Consolidated_Arrears_Vs_Portfolio_Balance_Ltd
Consolidated_Arrears_Vs_Portfolio_Balance_Pure

In SAS:

Consolidated_Arrears_Vs_Portfoli
Consolidated_Arrears_Vs_Portfoli

SAS Labels:

Consolidated_Arrears_Vs_Portfolio_Balance_Ltd
Consolidated_Arrears_Vs_Portfolio_Balance_Pure

Итак, как мне определить разницу в коде между этими двумя?

Заранее спасибо.

1 Ответ

1 голос
/ 25 марта 2019

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

Исходный SQL

select Abracadabra_Magical_Unity_Formation_SequenceId  from AMUF_Master

Замените на

select %nameFor(Abracadabra_Magical_Unity_Formation_SequenceId)  from AMUF_Master

Макрос %nameFor будетЛибо выполните динамический поиск по таблицам в библиотеке, либо, возможно, лучше, когда вы создаете статическую таблицу, создайте таблицу фиксированных отображений из одноразового поиска

* presume SQL data now in libref MIGRATED;
* do once to get the variable metadata that includes LABEL and NAME;
proc sql;
  create table static.nameFor as
  select * from sashelp.vcolumn
  where libnames = 'MIGRATED';

* use as needed;
%macro nameFor(SQL_Name);
  %sysfunc(dosubl(select NAME from static.nameFor where LABEL="&SQL_Name"))       
%mend;

Вы также можете использовать static.nameFor дляобнаружить все имена SQL, которые были изменены во время миграцииЭто будет where name ne label.

Автоматизированный подход заключается в создании программы поиска и замены, которая вносит изменения в копию исходных запросов SQL под рукой.

Поиск и замена будут либо

  • найти <long-named column>, заменить на %nameFor(<long-named column>) или
  • найти <long-named column>, заменить на <migrated to SAS column name>

Первый способ замены добавляет шум.Второй способ теряет некоторые оригинальные запросы 'true-flavour'

...