Sql server 将下拉表代码更改为追加/插入
这段代码目前正在使用一个DROP表将数据从Access传输到sqlserver,也就是说,它原本是供一个人使用的。现在它将被多人使用,所以我需要修改代码以附加。我试图找出如何让它检查目标表,看看记录是否已经存在,如果存在,它将跳过它,如果不存在,它将把员工数据写入表中。SQL表是预构建的,它具有access表没有的行ID列和时间戳列,以便跟踪输入的记录 代码当前看起来像:Sql server 将下拉表代码更改为追加/插入,sql-server,ms-access,vba,Sql Server,Ms Access,Vba,这段代码目前正在使用一个DROP表将数据从Access传输到sqlserver,也就是说,它原本是供一个人使用的。现在它将被多人使用,所以我需要修改代码以附加。我试图找出如何让它检查目标表,看看记录是否已经存在,如果存在,它将跳过它,如果不存在,它将把员工数据写入表中。SQL表是预构建的,它具有access表没有的行ID列和时间戳列,以便跟踪输入的记录 代码当前看起来像: Public Function Update() Dim cdb As DAO.Database, qdf As DAO.Q
Public Function Update()
Dim cdb As DAO.Database, qdf As DAO.QueryDef
Dim err As DAO.Error
Const DestinationTableName = "AC_CDData"
Const ConnectionString = _
"ODBC;" & _
"Driver={SQL Server Native Client 10.0};" & _
"Server=SERVER;" & _
"Database=DB;" & _
"UID=ID;" & _
"PWD=PW;"
Set cdb = CurrentDb
Set qdf = cdb.CreateQueryDef("")
qdf.Connect = ConnectionString
qdf.SQL = _
"IF EXISTS " & _
"(" & _
"SELECT * FROM INFORMATION_SCHEMA.TABLES " & _
"WHERE TABLE_NAME='" & DestinationTableName & " '" & _
") " & _
"DROP TABLE [" & DestinationTableName & "]"
qdf.ReturnsRecords = False
On Error GoTo Update_qdfError
qdf.Execute dbFailOnError
On Error GoTo 0
Set qdf = Nothing
Set cdb = Nothing
DoCmd.TransferDatabase _
acExport, _
"ODBC Database", _
ConnectionString, _
acTable, _
"CDData", _
DestinationTableName, _
False
Exit Function
Update_qdfError:
For Each err In DAO.Errors
MsgBox err.Description, vbCritical, "Error " & err.Number
Next
End Function
DoCmd.TransferDatabase
将数据从Access表完全传输到SQL Server数据库。此函数无法基于现有记录执行部分插入
但是,您可以做的是将数据导出到临时新表中(而不删除现有表),然后执行SQLMERGE
语句,将临时表的新记录与现有表合并
您需要知道如何从VBA对SQL数据库执行SQL查询,并且需要知道如何使用SQL
MERGE
语句。谷歌搜索将很快为您提供这两个问题的答案。只需在Access中设置一个到SQL server的简单标准链接表即可
由于现有记录的列是一个主键(或者简单地说是一个index set=unique),因此您只需要一行代码来附加数据
这将有助于:
CurrentDb.Execute "INSERT INTO AC_CDData SELECT * FROM CDData;"
由于键(或索引)冲突,已存在的任何行都将被忽略。因此,只有新的不存在的记录才会附加上述一行代码
编辑:
至于目标表是SQL链接表?启动时的应用程序并不关心是否有一些链接表。除非您使用这些链接表,否则您的应用程序既不使用也不关心这些链接表
这里假设您有一个本地数据表。链接表仅在您要进行导出时起作用。如上所述,除非连接到SQL server,否则无法导出。本问题不涉及“代码”或测试(如果您已连接),但即使在这两种情况下它都是问题的一部分,您仍必须测试连接,并且在您最终确定您已连接并决定导出时,再次按照上述方法导出链接表
因此,我实在想不出为什么只有在附加到SQL表的过程中才使用链接表会有任何问题
如上所述,一行VBA代码在这里就足够了。如果同时使用,则需要更改流程:
DestinationTableName
每个会话(线程)必须是唯一的,并且需要更改(从常量更改为变量)DestinationTableName
neame和neame的选项卡需要在导出数据之前删除(与当前解决方案中的情况相同)DoCmd.TransferDatabase
不会更改-数据将导出到唯一的临时表中合并
过程,可以在SQL Server端使用源表名作为参数编写存储过程(包括所有需要的APSERT逻辑)。需要在DoCmd.TransferDatabase
完成后调用此SP
唯一名称生成DestinationTableName
- 正在SQL Server端删除此表(
)qdf.Execute…
- 将数据导出到临时表(
)DoCmd.TransferDatabase…
- 在SQL Server端合并数据(使用所需的更新/插入逻辑调用已创建的SP)