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)
我正在使用 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)