在DB2中,如何将SYSCAT.COLUMNS表的LENGTH这样的关键字与SQL Script中的CONCAT一起使用,以使VARCHAR列的长度加倍

时间:2012-03-13 13:33:41

标签: sql select db2 conditional

在我的下面,SQL LENGTH是一个关键字,也是表SYSCAT.COLUMNS中的列名。如何更正以下查询。我正在异常

SELECT 'ALTER TABLE ' CONCAT TABNAME CONCAT ' ALTER COLUMN ' CONCAT  COLNAME CONCAT ' SET DATA TYPE ' CONCAT TYPENAME CONCAT '('
CONCAT LENGTH CONCAT ');'
FROM SYSCAT.COLUMNS
WHERE TABSCHEMA= 'ABC' AND TYPENAME = 'VARCHAR' AND TABNAME = 'XYZ';

例外: -

[Error] Script lines: 1-4 --------------------------
 DB2 SQL error: SQLCODE: -440, SQLSTATE: 42884, SQLERRMC: CONCAT;FUNCTION
 Message: No authorized routine named "CONCAT" of type "FUNCTION" having compatible arguments was found.

2 个答案:

答案 0 :(得分:0)

在DB2 for Linux,UNIX和Windows 9.7之前的版本中,DB2强制执行强类型。因此,如果不首先将INTEGER转换为字符串,则无法连接VARCHAR和INTEGER。

SELECT 
    'ALTER TABLE ' CONCAT TABNAME 
    CONCAT ' ALTER COLUMN ' CONCAT  COLNAME 
    CONCAT ' SET DATA TYPE ' CONCAT TYPENAME 
    CONCAT '(' CONCAT char(LENGTH) CONCAT ');'
FROM 
    SYSCAT.COLUMNS
WHERE 
    TABSCHEMA= 'ABC' 
    AND TYPENAME = 'VARCHAR' 
    AND TABNAME = 'XYZ';

在DB2 9.7中,IBM添加了隐式转换,因此您的查询将按照书面形式工作。

答案 1 :(得分:0)

CONCAT(||)适用于字符串。我怀疑LENGTH不是字符串

尝试将它们转换为字符串(char):char(LENGTH)而不是LENGTH

现在您的查询如下: - SELECT'ALTER TABLE'CONCAT TABNAME CONCAT'ALTER COLUMN'CONCAT COLNAME CONCAT'设置数据类型'CONCAT TYPENAME CONCAT'('CONCAT CHAR(LENGTH)CONCAT');'来自SYSCAT.COLUMNS,其中TABSCHEMA ='ABC'和TYPENAME ='VARCHAR'和TABNAME ='XYZ';