3

我正在使用 AS400 DB2 数据库。在那个数据库中,我得到了 3 个视图。

所有视图都具有完全相同的列名和数据类型。视图 1 和 2 每个都包含一个 Select 语句,该语句在同一源表上具有聚合函数。只是 WHERE 条件和聚合函数有点不同。

View 3 只是 VIEW 1 和 2 上的 UNION SELECT 合并结果。

所以这是我的问题。

SELECT 2 AS CLIENT, COLUMN1, COLUMN2, COLUMN3, COLUMN4, VALUE 
FROM SOME_DATABASE.VIEW3
WHERE COLUMN1 = @COLUMN1 AND COLUMN2 = @COLUMN2 ORDER BY COLUMN3

我可以在 VIEW 1 和 2 上从我的 c# 程序执行参数化的 SELECT 语句(如上面的那个)而没有问题,但是当我尝试在 VIEW 3 上使用参数化的 SELECT 时,我得到一个“SQL0901 SQL 系统错误”。但是,当我不使用参数时,它就可以正常工作。

谁能向我解释这种行为?

AS400 DB2 版本是 v5r2m0 该程序是在 VS 2012 的 .NET 4.0 上用 c# 编写的,使用“IBM.Data.DB2.iSeries.dll”来访问数据库

定义视图1:

SELECT  COLUMN1,  
        COLUMN2,  
        COLUMN3,  
        COLUMN4,  
        SUM(CAST((TRIM(SUBSTR(COLUMN5,104,1))||TRIM(SUBSTR(COLUMN5,94,3))||TRIM(SUBSTR(COLUMN5,98,3))||'.'||TRIM(SUBSTR(COLUMN5,102,2))) AS DECIMAL(10,2))) AS VALUE
FROM    SOME_DATABASE.SOME_TABLE  
WHERE   TRIM(SUBSTR(COLUMN5,105,3)) <> ''
AND     SUBSTR(COLUMN5,103,5) <> '  EUR'  
AND     COLUMN4 IN ('  $NEHHZ','$NEHHZVE','$NEHWMVE','  $NEHWW','$NEHWWVE','$NEHWWSK',' $NEHKW1',' $NEHKW2',' $NEHSK1',' $NEHSK2','  $NEHNV',' $NEHKZ1',' $NEHLZ1',' $NEHSZ1')  
GROUP BY  COLUMN1,  
        COLUMN2,  
        COLUMN3,  
        COLUMN4  

定义视图2:

SELECT  COLUMN1,  
        COLUMN2,  
        COLUMN3,  
        COLUMN4,  
        SUM(CAST(TRIM(SUBSTR(COLUMN5,109,1))||TRANSLATE(TRIM(SUBSTR(COLUMN5,99,10)),'.',',') AS DECIMAL(10,2))) AS VALUE  
FROM    SOME_DATABASE.SOME_TABLE  
WHERE   COLUMN6 != 0  
AND     COLUMN4 IN (' SUM$HKV',' SUM$KWZ',' SUM$KZ',' SUM$LZ',' SUM$SZ',' SUM$WMZ',' SUM$WWZ')  
GROUP BY COLUMN1,  
        COLUMN2,  
        COLUMN3,  
        COLUMN4  

定义视图3:

SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4, VALUE
FROM SOME_DATABASE.VIEW1
UNION
SELECT COLUMN1, COLUMN2, COLUMN3, COLUMN4, VALUE
FROM SOME_DATABASE.VIEW2
4

1 回答 1

1

看起来视图上的视图不支持参数化的 SELECT 语句。我刚刚将第 3 个视图替换为包含视图 1 UNION 视图 2 定义的语句,例如:

SELECT  COLUMN1,  
        COLUMN2,  
        COLUMN3,  
        COLUMN4,  
        SUM(CAST((TRIM(SUBSTR(COLUMN5,104,1))||TRIM(SUBSTR(COLUMN5,94,3))||TRIM(SUBSTR(COLUMN5,98,3))||'.'||TRIM(SUBSTR(COLUMN5,102,2))) AS DECIMAL(10,2))) AS VALUE
FROM    SOME_DATABASE.SOME_TABLE  
WHERE   TRIM(SUBSTR(COLUMN5,105,3)) <> ''
AND     SUBSTR(COLUMN5,103,5) <> '  EUR'  
AND     COLUMN4 IN ('  $NEHHZ','$NEHHZVE','$NEHWMVE','  $NEHWW','$NEHWWVE','$NEHWWSK',' $NEHKW1',' $NEHKW2',' $NEHSK1',' $NEHSK2','  $NEHNV',' $NEHKZ1',' $NEHLZ1',' $NEHSZ1')  
GROUP BY  COLUMN1,  
        COLUMN2,  
        COLUMN3,  
        COLUMN4

UNION

SELECT  COLUMN1,  
        COLUMN2,  
        COLUMN3,  
        COLUMN4,  
        SUM(CAST(TRIM(SUBSTR(COLUMN5,109,1))||TRANSLATE(TRIM(SUBSTR(COLUMN5,99,10)),'.',',') AS DECIMAL(10,2))) AS VALUE  
FROM    SOME_DATABASE.SOME_TABLE  
WHERE   COLUMN6 != 0  
AND     COLUMN4 IN (' SUM$HKV',' SUM$KWZ',' SUM$KZ',' SUM$LZ',' SUM$SZ',' SUM$WMZ',' SUM$WWZ')  
GROUP BY COLUMN1,  
        COLUMN2,  
        COLUMN3,  
        COLUMN4 

现在它完美地工作了。但我仍然不明白为什么会发生这个错误。

于 2013-02-06T15:36:07.180 回答