Progress-ODBC-TSQL动态列CASE语句截断数据

Progress-ODBC-TSQL CASE Statement for Dynamic Column is Truncating Data

我正在使用 ODBC 驱动程序通过 Windows C# 应用程序连接到 Progress 数据库。我遇到的问题是我的数据被截断了。

SELECT 
    CASE 
        WHEN (table1_qty_comp = 0) THEN 'Pending' 
        ELSE 
            CASE WHEN (table1_qty_comp >= table2_qty_req) THEN 'Completed'       
            ELSE 'In-Process' 
            END
       END AS 'Status'
FROM 
    table1 LEFT JOIN table2 ON table1_part = table2_part

只有 8 个字符会出现在我的 'Status' 列中,所以 'In-Process' 变成 'In-Proce'。
我尝试了各种 casts/converts 例如

cast('In-Process' as varchar)
cast('In-Process' as varchar(12))
cast('In-Process' as nvarchar)
cast('In-Process' as nvarchar(12))
convert(varchar(12), 'In-Process')
convert(nvarchar(12), 'In-Process')
str('In-Process')

无济于事。我怎样才能让完整的 'In-Process' 出现在我的专栏中?

以下是我如何从 C# 查询 Progress 数据库

DataTable dt = new DataTable();
try
{
    using (OdbcConnection conn = new OdbcConnection(GetConnectionString(db)))
    {
        OdbcCommand cmd = new OdbcCommand(qry, conn);

        conn.Open();
        OdbcDataAdapter adpt = new OdbcDataAdapter(cmd);
        adpt.Fill(dt);
    }                
 }
 catch (OdbcException e)
 {

 }

 return dt;

更新

我想在我的问题中附加可能有用的信息...这是 ODBC 驱动程序:Vendor=DataDirect,Progress SQL92 v9.1E,版本 4.10.01。以下是另一位用户在评论中提供的针对此特定驱动程序的一些资源,here and here 此外,我能够通过不使用嵌套的 CASE 语句来解决我的问题,例如:

SELECT 
        CASE 
            WHEN (table1_qty_comp = 0) THEN 'Pending'                 
            WHEN (table1_qty_comp >= table2_qty_req) THEN 'Completed'       
            ELSE 'In-Process'               
        END AS 'Status'
    FROM 
        table1 LEFT JOIN table2 ON table1_part = table2_part

澄清这个答案。虽然 OP 问题可以通过 CASE 中的多个 WHEN 来解决,但我的理解是这是伪代码和 OP 需要 子案例。在这种情况下,有一个错误 [我认为] 会截断字符串数据。下面的语法是为了解决这个问题。我认为,这个问题的价值在于数据切割而不是你可以使用多个 WHEN

SELECT 
    CASE 
       WHEN myCol = 0 THEN 'Pending' 
        WHEN myCol = 1 THEN 'Completed' 
        ELSE 'In-Process' 
    END  Status
FROM
  (SELECT 
       CASE 
           WHEN (table1_qty_comp = 0) THEN 0 
           ELSE 
               CASE WHEN (table1_qty_comp >= table2_qty_req) THEN 1       
               ELSE 2 
               END
       END AS myCol
    FROM 
        table1 LEFT JOIN table2 ON table1_part = table2_part) t1

Progress 数据库将所有值存储为可变长度并且不支持任何宽度属性。

Progress 4GL 非常乐意处理 "over stuffed" 字段。这对于 Progress 应用程序来说是正常的,但它适合 SQL 客户。

您正在使用 运行ning Progress 版本 9(这是古老的、过时的且不受支持的),因此您唯一的选择是在客户端上处理它(如 post 和通过 T.S.) 或 运行 提供的 "dbtool" 实用程序回答。 dbtool 实用程序将扫描数据库并找到任何被过度填充的字段,然后调整 "sql width" 以便 SQL 客户端准确了解实际数据宽度。

这可能会有帮助:

Fixing sql length error in progress 4gl 10.2B

(该答案适用于 OpenEdge 10.2b,但它也适用于 Progress 9.1e)