Оператор Progress-ODBC-TSQL CASE для динамического столбца усекает данные

Я использую драйвер ODBC для подключения к базе данных Progress через приложение Windows C#. Проблема в том, что мои данные усекаются.

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 символов появятся в моем столбце "Статус", поэтому "In-Process" превращается в "In-Proce".
Я пробовал различные приведения / преобразования, такие как

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" для отображения в моей колонке?

Вот как я запрашиваю базу данных Progress из C#

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

2 ответа

Решение

База данных Progress хранит все значения как переменную длину и не учитывает какой-либо атрибут ширины.

Progress 4GL очень рад иметь дело с "переполненными" полями. Это нормально для приложения Progress, но подходит для клиентов SQL.

Вы работаете с Progress version 9 (которая устарела, устарела и не поддерживается), поэтому ваши единственные варианты - либо справиться с ней на клиенте (как видно из поста и ответа TS), либо запустить предоставленную утилиту "dbtool". Утилита dbtool просканирует базу данных и найдет все поля, которые были переполнены, а затем отрегулирует "ширину sql", чтобы у клиентов SQL была точная картина фактической ширины данных.

Это может быть полезно:

Исправление ошибки длины sql в процессе 4gl 10.2B

(этот ответ для OpenEdge 10.2b, но он будет работать так же хорошо с Progress 9.1e)

Чтобы уточнить этот ответ. Хотя проблема ОП может быть решена с помощью нескольких WHEN в CASEНасколько я понимаю, это псевдокод, а 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
Другие вопросы по тегам