将Access随机查询代码适配SQL Server时遇'Time'函数未识别错误
解决SQL Server中随机获取记录的问题
你遇到的问题核心是Access和SQL Server的随机函数逻辑完全不同:Access里的Time()和RND()组合是Access专属的写法,SQL Server不认识Time()函数,而且直接用RAND()也达不到预期效果(因为RAND()在单次查询中只会生成一个固定值,所有行的随机数都一样)。
正确的SQL Server随机排序方案
SQL Server里要实现随机排序获取Top N条记录,最常用且有效的方式是用NEWID()函数,它会为每一行生成唯一的随机标识符,以此排序就能得到随机结果。
修改你的SQL语句如下:
Dim sql As String = String.Format("SELECT Top {0} ID, First_Name, Last_Name FROM FACTORY ORDER BY NEWID()", rows)
如果想要更贴近你原来基于ID的随机逻辑(避免极端情况的重复随机性),也可以结合CHECKSUM和NEWID(),让随机性和ID绑定:
Dim sql As String = String.Format("SELECT Top {0} ID, First_Name, Last_Name FROM FACTORY ORDER BY CHECKSUM(ID, NEWID())", rows)
为什么你之前的替换没效果?
你用convert(time(0),getDate())替换Time()后,SQL Server的RND()函数如果不带参数,在整个查询执行过程中只会计算一次,所有行得到的随机值完全相同,排序后自然还是原来的顺序,根本达不到随机的效果。而NEWID()会为每一行生成独立的随机值,这才是实现随机排序的正确姿势。
完整修改后的VB代码片段
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click DataBase_Connection() Dim rows As Integer If Not Integer.TryParse(TextBox1.Text, rows) Then MsgBox("DECIMAL NUMBER NOT AVAILABLE", MsgBoxStyle.Critical + MsgBoxStyle.OkOnly, "ERROR") TextBox1.Text = "" TextBox1.Focus() Exit Sub End If ' 替换为SQL Server兼容的随机排序语句 Dim sql As String = String.Format("SELECT Top {0} ID, First_Name, Last_Name FROM FACTORY ORDER BY NEWID()", rows) InfoCommand = New SqlCommand(sql, Con) InfoAdapter = New SqlDataAdapter() InfoAdapter.SelectCommand = InfoCommand InfoTable = New DataTable() InfoAdapter.Fill(InfoTable) DataGridView1.DataSource = InfoTable End Sub
内容的提问来源于stack exchange,提问作者ABIDINE
相关产品推荐
相关产品推荐

