When you assemble a string containing a SQL statement (the technique is usually called Dynamic SQL or Dynamic Query), according to it's purpose you can:
1. Have it executed (action query):
Code:
Sub ClearTable(ByVal TableName As String)
Const c_SQL As String = "DELETE FROM @D;"
Dim strSQL As String
strSQL = Replace(c_SQL, "@D", TableName)
CurrentDb.Execute strSQL, dbFailOnError
End Sub
2. Create a new query or modify an existing one:
Code:
Sub QuerySQL(ByVal QueryName As String)
Const c_SQL As String = "SELECT * FROM MyTable WHERE CustomerID = '@C';"
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Dim strSQL As String
strSQL = Replace(c_SQL, "@C", Me.ComboCustomers.Value)
Set dbs = CurrentDb
'
' Existing Query.
'
Set qdf = dbs.QueryDefs(QueryName)
qdf.SQL = strSQL
'
' New Query
'
Set qdf = dbs.CreateQueryDef(QueryName)
qdf.SQL = strSQL
End Sub
3. Assign it to the RecordSource (for a Form or a Report) or the RowSource (for a ListBox or a ComboBox) of a data object:
Code:
Sub SourceSQL()
Const c_SQL As String = "SELECT * FROM MyTable WHERE CustomerID = '@C';"
Dim strSQL As String
strSQL = Replace(c_SQL, "@C", Me.ComboCustomers.Value)
'
' To a subform.
'
Me.SubForm1.Form.RecordSource = strSQL
'
' To a ListBox.
'
Me.List1.RowSource = strSQL
End Sub
4. Open a RecordSet:
Code:
Sub RecordsetSQL()
Const c_SQL As String = "SELECT * FROM MyTable WHERE CustomerID = '@C';"
Dim rst As DAO.Recordset
Dim strSQL As String
strSQL = Replace(c_SQL, "@C", Me.ComboCustomers.Value)
Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
With rst
Do Until .EOF
' Do something with the rows of data...
.MoveNext
Loop
.Close
End With
Set rst = Nothing
End Sub
5. Use it to send a command to a SQL Server (pass-through query):
Code:
Sub PassThroughSQL()
Const c_SQL As String = "ALTER TABLE [Tbl_Channels] ADD CONSTRAINT [DF_Tbl_Channels_Inactive] DEFAULT ((0)) FOR [Inactive];"
Const c_Cnn As String = "ODBC;DRIVER={SQL Server};SERVER=SANDBOX;DATABASE=Sales;Trusted_Connection=Yes;"
Dim dbs As DAO.Database
Dim qdf As DAO.QueryDef
Set dbs = CurrentDb
'
' Create a (temporaty) Pass-Through Query.
'
Set qdf = dbs.CreateQueryDef("")
With qdf
.Connect = c_Cnn
.SQL = c_SQL
.Execute
End With
Set qdf = Nothing
End Sub