猿问

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

我正在使用 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 个字符,因此“处理中”变成“处理中”。

我尝试了各种强制转换/转换,例如


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')

无济于事。如何让完整的“进行中”出现在我的专栏中?


这是我从 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。以下是其他用户在评论中提供的此特定驱动程序的一些资源,此处和此处 此外,我能够通过不使用嵌套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


梦里花落0921
浏览 162回答 2
2回答

白板的微信

澄清这个答案。虽然 OP 问题可以通过多个WHENin来解决CASE,但我的理解是这是伪代码,OP需要子案例。在这种情况下,有一个错误 [我认为] 会截断字符串数据。下面的语法就是为了解决这个问题。我认为,这个问题的价值在于数据切割而不是你可以使用多个WHENSELECT     CASE        WHEN myCol = 0 THEN 'Pending'         WHEN myCol = 1 THEN 'Completed'         ELSE 'In-Process'     END  StatusFROM  (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 非常乐意处理“过度填充”字段。这对于 Progress 应用程序来说是正常的,但它适合 SQL 客户端。您正在运行 Progress 版本 9(它是古老的、过时的且不受支持的),因此您唯一的选择是在客户端上处理它(如帖子和 TS 的回答中所见)或运行提供的“dbtool”实用程序。dbtool 实用程序将扫描数据库并查找任何被过度填充的字段,然后调整“sql 宽度”,以便 SQL 客户端准确了解实际数据宽度。
随时随地看视频慕课网APP
我要回答