Как мне работать с полями с одинаковыми именами в исходной базе данных, различающимися только по имени метки?

#variables #sas #naming

#переменные #sas #именование

Вопрос:

Настройка базы данных в моей организации — это таблицы 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. Это помогло бы показать, что на самом деле происходит в данный момент. Насколько я знаю, набор данных SAS не может содержать две переменные с одинаковыми именами, поэтому я предполагаю, что вы не смогли создать такой набор данных. Вы получаете ошибки при попытке? Если у вас есть два отдельных набора данных с этими переменными в них, вы можете использовать оператор ПЕРЕИМЕНОВАНИЯ (или параметр ПЕРЕИМЕНОВАТЬ набор данных), чтобы переименовать один или оба из них.

2. Как вы подключаетесь к базе данных SQL Server? Используете ли вы инструкцию LIBNAME и позволяете ли SAS автоматически преобразовывать ваш код SAS в код SQL Server для запроса базы данных? Или вы используете сквозные SQL-запросы для запуска кода SQL Server непосредственно в базе данных?

3. Вы пробовали 40 ударов мокрой лапшой по разработчику этой базы данных?

4. У вас могут быть идентичные столбцы в случае представления. Вы увидите ПРЕДУПРЕЖДЕНИЕ, когда представление будет реализовано, и другие столбцы с одинаковыми именами будут удалены. Также возможны ...Portfoli и ...Portfol1 , которые выглядят одинаково I для 1

5. Привет, я пока склоняюсь ко второму варианту Тома, хотя сомневаюсь, что wet — лучший вариант? Технические вопросы: Таблицы данных автоматически настраиваются нашим администратором SAS, поэтому они существуют в той или иной форме на сервере SAS, и когда мы открываем Enterprise Guide и переходим к Open> Data, вложенные библиотеки находятся в папке SASApp Library, имя libname не требуется. Когда я нажимаю на свойства библиотеки, указывается следующее: Движок: ODBC, Параметры: schema =’dbo’ ACCESS =DATASRC ТОЛЬКО ДЛЯ ЧТЕНИЯ = LIVE_REP Я думаю, что таблица представляет собой представление SQL.

Ответ №1:

Чтобы использовать данные как собственные в 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="amp;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>

Первый способ замены добавляет шума. Второй способ приводит к потере части «истинного вкуса» исходных запросов