如何处理源数据库中名称相同的字段,仅按标签名称区分?

时间:2019-03-25 11:10:09

标签: variables sas naming

在我的组织中,数据库设置是将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 个答案:

答案 0 :(得分: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="&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>

第一种替换方法会增加噪音。 第二种方法会丢失一些原始查询“真味”