订购错误订单

时间:2012-04-12 17:11:27

标签: c# sql-server sql-order-by

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

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

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

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

我无法弄清楚为什么它会获得中等数量。


感谢各位快速回复,但经过一些测试后,我发现我的问题出现在我的C#代码中,而不是sql。

获得查询结果后,我想:

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

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

我将if语句替换为:

if (PurchOrder.HasRows == true)

一切都很好。

再次感谢您的回复。对于误导性问题,我们深表歉意。

-Cody

3 个答案:

答案 0 :(得分:1)

如果partnum是字母数字,除非你是

,否则它不会按数字顺序排序
  • Left Pad partnum输出完全相同的字符数

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

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

当然,如果字段较小,则可以使用更低的填充数。

答案 1 :(得分:0)

从SQL Server端,只要partnum,packaging和quantity是一个数字/浮点字段,这应该绝对正常。令我担心的是,如果包装或partnum是10 2之前的文本类型变量。

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

例如:

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#)而言,您是将它存储在某种gridview中吗?

答案 2 :(得分:0)

感谢各位快速回复,但经过一些测试后,我发现我的问题出现在我的C#代码中,而不是sql。

获得查询结果后,我想:

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

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

我将if语句替换为:

if(PurchOrder.HasRows == true)

一切都很好。

再次感谢您的回复。对于误导性问题,我们深表歉意。

-Cody