我相信我有一个非常简单的问题,这将帮助我完成我的项目。我通常不使用 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。
编辑
在这种情况下,我肯定会走模板路线。
- 使用 TOP n 的示例值构建查询“qUnionTop”。
- 将 SQL 复制到存储模板 SQL 的表中。
- 使用变量编辑 SQL,例如
从 tblx UNION 中选择 TOP $c1$ col1 从 TBLY UNION 中选择 TOP $c2$ col1 ...
- 在打开查询之前,运行如下代码:
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/