You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:28:15