在我的下面,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.
答案 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';