将值从文本框传递到 SQL 查询中的“TOP n”子句

Posted

技术标签:

【中文标题】将值从文本框传递到 SQL 查询中的“TOP n”子句【英文标题】:Passing value from the textbox to "TOP n" clause in SQL query 【发布时间】:2016-11-15 08:09:30 【问题描述】:

我相信我有一个非常简单的问题,这将帮助我完成我的项目。我通常不使用 Access,但我被要求帮助某人,所以我在这里。

我的问题:我有一个名为“Start”的 Form1,其中有一个名为“Kat1”的 TextBox1。 我也有一个 SQL 查询:

SELECT TOP 3 tbl.Example FROM TABLE TBL

我想要实现的是让用户在“Kat1”中写入一些数字,以便查询返回这么多的顶部行。

我希望有一种不使用 VBA 的方法,因为我的查询相当复杂,有更多的文本框,更多的子查询选择顶行等。

我尝试输入SELECT TOP [Start]![Kat1]!Value 或类似名称。我的语法可能有问题,或者这一切都错了,还有另一种方法。 提前感谢您的帮助。

编辑: 对于未来的读者;)这就是我用 VBA 解决它的方法:

Sub Query_Change()

SQLstring = "SELECT TOP KAT1 col1 FROM TBL UNION SELECT TOP KAT2 col1 FROM TBL etc..."`

CurrentDb.QueryDefs("MyQuery").SQL = SQLstring

For i = 1 To 4
    SQLstring = Replace(SQLstring, "KAT" & i, Forms!Start!("Kat" & i).Value)
Next i

CurrentDb.QueryDefs("MyQuery").SQL = SQLstring
End Sub

代码将在用户将值放入文本框后运行。

【问题讨论】:

【参考方案1】:

这在 Access 查询中是不可能的,“TOP n”部分不能带变量/参数。

(在 SQL Server 中可以,请参阅Dynamic SELECT TOP @var In SQL Server)

您需要 VBA 才能做到这一点。要么,因为它位于 SELECT 语句的第一部分,请阅读原始 Querydef.SQL 并对其进行编辑(替换第三个“单词”)。

或者有一个带有模板 SQL 代码的表,例如

SELECT TOP $count$ FROM table WHERE ...

$count$ 替换为您的号码并将结果写入查询定义。

编辑

在这种情况下,我肯定会走模板路线。

    使用 TOP n 的示例值构建查询“qUnionTop”。 将 SQL 复制到存储模板 SQL 的表中。 使用变量编辑 SQL,例如SELECT TOP $c1$ col1 FROM tblx UNION SELECT TOP $c2$ col1 FROM TBLY UNION ... 在打开查询之前运行如下代码:
Sub DynamicQueryFromTemplate()

    Dim S As String
    Dim i As Long

    ' Read template SELECT SQL from tblTemplates
    S = DLookup("Sql", "tblTemplates", "Key = 'qUnionTop'")
    ' Replace $c[x]$
    For i = 1 To 4
        S = Replace(S, "$c" & i & "$", Forms!Start("Kat" & i).Value)
    Next i

    CurrentDb.QueryDefs("qUnionTop").SQL = S

End Sub

当您的查询需要更改时,重复步骤 2.+3。

【讨论】:

好的,所以我应该使用 VBA(这很糟糕)。你能指导我一点吗?在我的表单中,我有 4 个文本框(kat1、kat2、kat3、kat4),因此用户可以输入 4 个值,这些值稍后会进入查询:SELECT TOP kat1.value col1 FROM tblx UNION SELECT TOP kat2.value col1 FROM TBLY UNION etc 创建一个将转到 n 的 VBA 脚本是个好主意吗? - 查询中的第一个位置(放置在 TOP 之后和列名称之前)并将其替换为 TextBox 值?然后用不同的 n 值重复 4 次? 感谢您的帮助。我通过在我的 SQL 中放置一些占位符来避免构建另一个查询,这些占位符稍后会替换为您的 VBA 代码并进行一些调整。【参考方案2】:

在表单属性上转到事件选项卡。在on load 事件中,您应该创建一个如下所示的事件过程:

Option Compare Database

Private Sub Command0_Click()
Dim kat As String

kat = "SELECT TOP " +Me.Kat1.Value + "TableName.TableField "


CurrentDb.QueryDefs("QueryName") .SQL = kat
On Error Resume Nest
DoDmd.RunQuery "QueryName"
End Sub

Private Sub Form_Load()
End Sub

Private Sub testrun()
End Sub

【讨论】:

以上是关于将值从文本框传递到 SQL 查询中的“TOP n”子句的主要内容,如果未能解决你的问题,请参考以下文章

将值从表单传递到表单

从简单模式窗口将值从 asp.net 复选框或文本框传递到服务器时遇到问题

如何将值从一个活动传递到上一个活动

使用DAO将值从java类传递给jsp页面

无法通过命令将值从视图传递到viewmodel

如何使用会话将值从一个php页面传递到另一个页面