2017-04-18 96 views
0

在函数内部,我使用了一个字符串来运行sql。我需要根据用户选择改变一些字符串。为简洁起见,我在每张表中只包含一个字段。而且,这些不是真正的表名。MS Access VBA:动态SQL

strSQL = "DELETE * FROM tblWax" 
db.Execute strSQL, dbFailOnError 

strSQL = "INSERT INTO tblWax (strPortName, lngShortSet) " & _ 
     "SELECT tblAAA.strPastName, tblBBB.lngShortID " & _ 
     "FROM tblAAA INNER JOIN tblBBB ON tblAAA.Parameter = tblBBB.Parameter" 
db.Execute strSQL, dbFailOnError 

我想替代tblSSS为tblBBB取决于用户的选择,并使用同样的选择(场strChoice内),tblWax需要被tblHat。那就是: 如果strChoice = 1,则tblWax,tblAAA,tblBBB 如果strChoice = 2,则tblHat,tblAAA,tblSSS

否则,串(一个或多个)的其余部分是相同的。

回答

1

要展开@ Smandoli's和@ Gustav关于为表名使用字符串变量的答案。这使您可以创建多个案例,而不会使SQL字符串中的变量名称迷失。

Select Case strChoice 

    Case 1: 
     strTarget = "tblWax" 
     strJoin = "tblBBB" 

    Case 2: 
     strTarget = "tblHat" 
     strJoin = "tblSSS" 

end select 

strSQL = "DELETE * FROM " & strTarget 
db.Execute strSQL, dbFailOnError 

strSQL = "INSERT INTO " & strTarget & " (strPortName, lngShortSet) " & _ 
     "SELECT tblAAA.strPastName, " & strJoin & ".lngShortID " & _ 
     "FROM tblAAA INNER JOIN " & strJoin & _ 
     " ON tblAAA.Parameter = " & strJoin & ".Parameter" 

db.Execute strSQL, dbFailOnError 
1

只需使用条件逻辑VBA类似的SELECT...CASE

Select Case strChoice 

    Case 1 
     strSQL = "DELETE * FROM tblWax" 
     db.Execute strSQL, dbFailOnError 

     strSQL = "INSERT INTO tblWax (strPortName, lngShortSet) " & _ 
       "SELECT tblAAA.strPastName, tblBBB.lngShortID " & _ 
       "FROM tblAAA INNER JOIN tblBBB ON tblAAA.Parameter = tblBBB.Parameter" 

    Case 2 
     strSQL = "DELETE * FROM tblHat" 
     db.Execute strSQL, dbFailOnError 

     strSQL = "INSERT INTO tblHat (strPortName, lngShortSet) " & _ 
       "SELECT tblAAA.strPastName, tblSSS.lngShortID " & _ 
       "FROM tblAAA INNER JOIN tblSSS ON tblAAA.Parameter = tblSSS.Parameter" 

End Select 

db.Execute strSQL, dbFailOnError 

你甚至可以在一种情况下

Case 1, 3, 5 
... 
Case 2, 4, 6 
... 

使用多个值,并使用Else对于不遵循其他Case陈述

休息
Case Else 
... 
+3

这可以通过在SQL中使用字符串变量来重构,例如'strTargetTable =“tblWax”'。 – Smandoli

+1

确实。 SQL不会更改,因此请使用_select-case_来确定表名,然后用表名替换SQL中的占位符。 – Gustav

+0

我确实喜欢选择案例,但案件数量很少,现在可能还没有。因此,我将使用select case将变量更改为表名,并将该变量放入SQL中。谢谢大家。 – random13