3

我的 C# 程序中有一条 SQL 语句,如下所示:

SELECT * FROM XXX.dbo.XXX 
WHERE Source = 'OH'
  AND partnum = '1231202085' 
ORDER BY partnum, Packaging, Quantity

在 SQL Server 管理中运行此查询时,结果按预期排序。我的前 3 个结果具有相同的部分和包装,数量分别为 32.0、50.8 和 51.0。

但是,当我从程序运行查询时,数量为 50.8 的结果集是第一个返回的。Quantity 的数据类型是十进制(18,9)。我试过强制转换,它似乎不是数据类型问题。

我不明白为什么它的数量中等。


谢谢你们的快速回复,但是经过更多测试后,我发现我的问题是在我的 C# 代码中,而不是在 sql 中。

得到查询结果后,我已经:

if (PurchOrder.Read())
while (PurchOrder.Read())

忽略第一次读取实际上会读取我的第一个结果的事实,然后会得到我的第二个结果。

我将 if 语句替换为:

if (PurchOrder.HasRows == true)

一切看起来都很好。

再次感谢您的回复。抱歉误导性问题。

-科迪

4

3 回答 3

1

如果 partnum 是字母数字,它不会按数字顺序排序,除非你

  • Left Pad partnum 输出完全相同的字符数

  • 使用一些专门的字母数字排序进行排序。我通常使用:

    order by
    RIGHT(REPLICATE('0', 1000) + LTRIM(RTRIM(CAST([field_name] AS VARCHAR(8000)))), 1000)
    

当然,如果您的字段较小,您可以使用低得多的填充数字。

于 2012-04-12T17:17:49.937 回答
0

从 SQL Server 端,只要 partnum、packing 和 quantity 是一个数字/浮点字段,这应该可以正常工作。让我担心的是,如果包装或零件编号是10之前出现的文本类型变量2

为避免这种情况,您必须在执行之前将数据类型CONVERT或整数/小数类型。在BOL中查找 CAST / Convert 。CASTORDER BY

例如这个:

CREATE TABLE #test
(
 mytest varchar(10)
)

INSERT INTO #test(mytest) VALUES('10')
INSERT INTO #test(mytest) VALUES('1')
INSERT INTO #test(mytest) VALUES('2')
INSERT INTO #test(mytest) VALUES('12')
INSERT INTO #test(mytest) VALUES('20')

SELECT * FROM #test ORDER BY mytest
DROP TABLE #test

产生不正确的排序。并且可以这样处理:

SELECT * FROM #test ORDER BY CAST(mytest AS INT)

就客户端(C#)而言,您是否将其存储在某种网格视图中?

于 2012-04-12T17:18:00.793 回答
0

谢谢你们的快速回复,但是经过更多测试后,我发现我的问题是在我的 C# 代码中,而不是在 sql 中。

得到查询结果后,我已经:

if (PurchOrder.Read()) 而 (PurchOrder.Read())

忽略第一次读取实际上会读取我的第一个结果的事实,然后会得到我的第二个结果。

我将 if 语句替换为:

if (PurchOrder.HasRows == true)

一切看起来都很好。

再次感谢您的回复。抱歉误导性问题。

-科迪

于 2012-08-17T17:14:01.937 回答