sql - 将值从文本框传递到 SQL 查询中的 "TOP n"子句

标签 sql ms-access

我相信我有一个非常简单的问题,这将帮助我完成我的项目。我通常不使用 Access,但有人要求我提供帮助,所以我就来了。

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

SELECT TOP 3 tbl.Example FROM TABLE TBL

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

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

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

编辑: 对于 future 的读者;)这就是我用 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

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

最佳答案

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

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

您需要 VBA 来完成此操作。或者,由于它位于 SELECT 语句的第一部分,因此请阅读原始 Querydef.SQL 并对其进行编辑(替换第三个“单词”)。

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

SELECT TOP $count$ FROM table WHERE ...

$count$ 替换为您的号码,并将结果写入 querydef。

编辑

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

  1. 使用 TOP n 的示例值构建查询“qUnionTop”。
  2. 将 SQL 复制到存储模板 SQL 的表中。
  3. 使用变量编辑 SQL,例如
    从 tblx UNION 中选择 TOP $c1$ col1 从 TBLY UNION 中选择 TOP $c2$ col1 ...
  4. 在打开查询之前,运行如下代码:
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。

关于sql - 将值从文本框传递到 SQL 查询中的 "TOP n"子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40604853/

相关文章:

ms-access - 单击按钮时如何制作是/否消息框

MYSQL - 按周分组,同时显示没有值的周

java - CREATE TABLE IF NOT EXISTS 在 UCanAccess 中引发错误

java - 在 Java 中解构 SQL 语句

sql - MS-Access 中同一字段中两种类型值的计数

java - Access DB 自动增量不允许我打开表

vba - MS Access 错误 2424 找不到对象

sql - MacOS 的 DB 素描器?

php - 从结果集中选择最新记录(mysql、php)

ms-access - Access 2013 VBA - 为控件设置新的点击事件