将值从文本框传递到 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”子句的主要内容,如果未能解决你的问题,请参考以下文章