我的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
答案 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
之前,您必须将CAST
或ORDER 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