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

Я использую драйвер 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 символов, поэтому «В процессе» превращается в «В обработке».
IПробовал различные приведения / преобразования, такие как

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 ]

0 голосов
/ 24 декабря 2018

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

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

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

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

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

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

0 голосов
/ 12 декабря 2018

Чтобы уточнить этот ответ.Хотя проблему OP можно было решить с помощью нескольких 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
...