准备SAS数据以填充SQL Server临时表,使用该临时表与SAS EG中的基本SQL Server表联接

时间:2018-12-17 03:33:53

标签: sql-server sas teradata

我有一个场景,我需要从数据库A的Teradata表中选择数据。使用该结果集填充SQL Server临时表。该临时表需要与基本SQL Server表联接。此结果集需要导出到另一个数据库表。需要在SAS企业指南中做到这一点

到目前为止,这是我的做法, 首先创建SAS数据集

步骤1

proc sql;
  connect to teradata(user="abc" pw="def" database=cust fast load=yes mode=Teradata);
create table tmp_result as
select  from connection to teradata
(
SELECT 
Cust_id,
Name,
Product
 FROM Teradata table where ProductId=10
)DISCONNECT FROM TERADATA;
QUIT;

STEP 2

proc sql;
connect to odbc(dsn=temp user="abc" pw="def" connection=shared);
create table ##tmp
(
Cust_id int
Name varchar(100),
Product varchar(50);
)disconnect from ODBC;
QUIT;

将第3个数据从第一个SAS数据集中插入到临时表中

步骤4 -从下面的选择查询中创建基本的sql server表

SELECT *
FROM base sql server table join temp table (above temp table)

步骤5 再次从上述第4步结果集中创建一个sas数据集,然后在最后一步

步骤6 将步骤5的结果集插入到Teradata表数据库B中。

我的方法需要帮助。.我仍在研究此解决方案,但如果我的方法正确,则需要您的意见

先谢谢了。

2 个答案:

答案 0 :(得分:0)

您可以通过为数据库定义libname来执行隐式sql传递。

//Fill a variable with x,y,z coordinates with a boolean value that is false.
var locations = {};

for (var x = 1; x <= 4; x++) {
  locations[x] = {};
  for (var y = 1; y <= 4; y++) {
    locations[x][y] = {};
    for (var z = 1; z <= 4; z++) {
      locations[x][y][z] = false;
    }
  }
}

//Set 4 values on the X axis to true for testing
locations[1][2][3] = true;
locations[2][2][3] = true;
locations[3][2][3] = true;
locations[4][2][3] = true;

//Set 4 values on the Z axis to true for testing
locations[1][2][1] = true;
locations[1][2][2] = true;
locations[1][2][3] = true;
locations[1][2][4] = true;


//Test if there are 4 on a row - note this can be done more efficient with a bit more thought and does not work for diagonals
var winX = false;
var winY = false;
var winZ = false;
for (var x = 1; x <= 4; x++) {
  for (var y = 1; y <= 4; y++) {
    for (var z = 1; z <= 4; z++) {
      if(locations[x][y][z]) {
        //check X for current position
        if(locations[1][y][z] && locations[2][y][z] && locations[3][y][z] && locations[4][y][z]) {
          winX = true;
        }
        //check Y for current position
        if(locations[x][1][z] && locations[x][2][z] && locations[x][3][z] && locations[x][4][z]) {
          winY = true;
        }
        //check Z for current position
        if(locations[x][y][1] && locations[x][y][2] && locations[x][y][3] && locations[x][y][4]) {
          winZ = true;
        }
      }
    }
  }
}

//Log the results, should return true for X and Z and false for Y
console.log("Win X: " + winX);
console.log("Win Y: " + winY);
console.log("Win Z: " + winZ);

答案 1 :(得分:0)

取决于数据量从Teradata导出,您将希望TPT=NO FASTEXPORT=YESTPT=YES FASTEXPORT=YES利用传统的FastExport或Teradata Parallel Transporter Export运算符。如果在您的SAS环境中安装了TPT,则后者要比前者更好。将数据推回Teradata,将FASTEXPORT替换为FASTLOAD,或者根据可用的数据量和TPT,考虑使用流运算符的TPT=YES MULTISTMT=YES

您的方法将取决于此SAS工作流程必须运行的频率,将有多少用户运行此工作流程,在数据库和SAS环境之间移动的数据量以及每个数据库平台是否都可以使用SAS / Access接口。

希望这会有所帮助。