我正在使用 Teradata 并行传输 从 SQL Server 中的表中选择数据并将其插入到 Teradata 数据库中的相同表中。我之前已经成功完成此操作,但这是我第一次在通过命令行运行脚本时看到此错误,我得到以下输出:
TD_LOADER: connecting sessions
TD_LOADER: preparing target table(s)
TD_LOADER: entering DML Phase
TD_LOADER: entering Acquisition Phase
ODBC_READER: sending SELECT request
ODBC_READER: TPT17107: Retrieval error for row: 1
ODBC_READER: TPT17101: Fatal error received from ODBC driver:
STATE=01004, CODE=0,
MSG='[Microsoft][SQL Server Native Client 11.0]String data, right truncation'
ODBC_READER: TPT17101: Fatal error received from ODBC driver:
STATE=01004, CODE=0,type here
脚本生成的 .out 文件的一部分显示:
TD_LOADER: connecting sessions
TD_LOADER: preparing target table(s)
TD_LOADER: entering DML Phase
TD_LOADER: entering Acquisition Phase
Job step 'load_the_data' uses the max row size 1024KB.
Job step 'load_the_data' uses the max Using Data Bytes: 1023991.
Job step 'load_the_data' allows data source containing rows that exceed the maximun
length of 1024KB
Task(APPLY_1[0001]): checkpoint completed, status = Success
Task(SELECT_2[0001]): checkpoint completed, status = Success
ODBC_READER: sending SELECT request
ODBC_READER: TPT17107: Retrieval error for row: 1
ODBC_READER: TPT17101: Fatal error received from ODBC driver:
STATE=01004, CODE=0,
MSG='[Microsoft][SQL Server Native Client 11.0]String data, right truncation'
ODBC_READER: TPT17101: Fatal error received from ODBC driver:
STATE=01004, CODE=0,
我的所有 TPT 脚本都遵循此模板:
USING CHAR SET ASCII
DEFINE JOB JobName
DESCRIPTION 'Load data from SQL(tablename) to Teradata(tablename)'
(
DEFINE OPERATOR Database_Commands()
TYPE DDL
ATTRIBUTES
(
VARCHAR TdpId = @Teradata_Connection,
VARCHAR UserName = @Teradata_UserId,
VARCHAR UserPassword = @Teradata_Password,
VARCHAR Array ErrorList = ['2580'],
VARCHAR PrivateLogName = 'ddllog.txt',
VARCHAR Tracelevel='None',
VARCHAR LogSQL = ''
);
/*Examples*/
DEFINE SCHEMA SourceTableSchema
(
columnname INTEGER,
columnname2 VARCHAR(50),
columnname3 VARCHAR(85),
columnname4 VARCHAR(15),
columnname4 BYTEINT
);
DEFINE SCHEMA TargetTableSchema
(
columnname INTEGER,
columnname2 VARCHAR(50),
columnname3 VARCHAR(85),
columnname4 VARCHAR(15),
columnname4 BYTEINT
);
DEFINE OPERATOR ODBC_READER
TYPE ODBC
SCHEMA SourceTableSchema
ATTRIBUTES
(
VARCHAR PrivateLogName = 'odbc_log.txt',
VARCHAR dsnName = 'SQLDatabaseName',
VARCHAR UserName = @ODBC_UserId,
VARCHAR UserPassword = @ODBC_Password,
VARCHAR TraceLevel = 'None',
VARCHAR SelectStmt = @SQL
);
DEFINE OPERATOR TD_LOADER()
TYPE UPDATE
SCHEMA TargetTableSchema
ATTRIBUTES
(
VARCHAR TargetTable = @TargetTable,
VARCHAR LogTable = @ErrDatabase||'.'||@TargetTable||'_LT',
VARCHAR WorkTable = @WorkDatabase||'.'||@TargetTable||'_WT',
VARCHAR ErrorTable1 = @ErrDatabase||'.'||@TargetTable||'_ET',
VARCHAR ErrorTable2 = @ErrDatabase||'.'||@TargetTable||'_UV',
VARCHAR DateForm = 'IntegerDate',
VARCHAR TdpId = @Teradata_Connection,
VARCHAR UserName = @Teradata_UserId,
VARCHAR UserPassword = @Teradata_Password,
VARCHAR WorkingDatabase = @TargetDatabase,
VARCHAR PrivateLogName = 'td_loader_log.txt'
);
STEP RELEASE
(
APPLY
' release mload '|| @TargetDatabase ||'.'||@TargetTable ||' ;'
TO OPERATOR (Database_Commands());
);
STEP Initialize
(
APPLY
' delete from '|| @TargetDatabase ||'.'||@TargetTable ||' '||@DeleteScope||' ;'
TO OPERATOR (Database_Commands());
);
STEP load_the_data
(
APPLY
('INSERT INTO '|| @TargetDatabase ||'.'||@TargetTable||'
(
...columnnames...
);'
)
TO OPERATOR (TD_LOADER)
SELECT
...columnnames...
FROM OPERATOR (ODBC_READER);
);
);
我尝试检查目标表和源表的表定义,但由于目标表是使用源表的定义创建的,因此它们是相同的,因此我不确定它们之间的大小问题是什么。
我在单独的文件中设置 VARCHAR SelectStmt = @SQL 的值。在此文件中,我必须将 select 语句从选择全部的语句更改为显式单独选择每一行并将 NVARCHAR 列转换为 VARCHAR 列的语句(如 Fred 建议的那样)。
CAST(源列名称 AS VARCHAR(目标列长度)) AS 目标列名称