Оператор 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